回 帖 发 新 帖 刷新版面

主题:二叉数的高度?

//h是全局变量初值0,h1是局部变量
void high(bitre T);
{
   int h1;
   if (T!=null)
   {
      high(T->lchild);
      h1=h;
      high(T->rchild);
      h=max(h1,h)+1;
   }
}

请问,h1不是保存了T->lchild的高度,max不是选出了左右子树的大者从而h是二叉树的高度吗?但为什么这个程序求得的是结点数,而不是高度?我实在看不懂,请大家指教。

回复列表 (共6个回复)

沙发

你去单步跟踪执行一下就知道
不过大概也看的出来,递归的时候你把依次按照顺序把
结点记数给打印出来了

int high(BiTNode *T)
{
   int h, h1;
   if (T == NULL)
   return 0;

   h = high(T->lchild);
   h1 = high(T->rchild);
   
   return (max(h1,h)+1);
   
}

int max(int h1, int h)
{
    if(h1 > h)
    {
        return h1;
    }
    else
    {
        return h;
    }
}

应该是如此,递归左子树,再递归右子树,再把大的拿来就是了~

板凳

[quote]你去单步跟踪执行一下就知道
不过大概也看的出来,递归的时候你把依次按照顺序把
结点记数给打印出来了

int high(BiTNode *T)
{
   int h, h1;
   if (T == NULL)
   return 0;

   h = high(T->lchild);
   h1 = high(T->rchild);
   
   return (max(h1,h)+1);
   
}

int max(int h1, int h)
{
    if(h1 > h)
    {
        return h1;
    }
    else
    {
        return h;
    }
}

应该是如此,递归左子树,再递归右子树,再把大的拿来就是了~
[/quote]

可能你没理解我要问的,我现在不是问怎么样模拟实现,也不是问树的高度怎么求,而是问[color=FF0000]一个递归程序应该怎么样去阅读它[/color]。

比如,二叉排序树下面的两个算法,其中一个算法正确,一个算法错误,怎么样[color=FF0000]不通过模拟[/color]去阅读它们,即[color=FF0000]只直接读代码分析程序本身[/color],而不是假设一些值代入运行。

变量说明:max初值为负无穷,即计算机能表示的最小值。

bool bisort(bitre T; datatype &max);
{
  if (T==null) return(true);
  else 
  {
    if !bisort(T->lchild,max)||(T->data<=max)
        return(false);
    else
    {
       max=T->data;
       return(bisort(T->rchild,max);
     }
   }
}

bool bisort(bitre T; datatype &max);
{
  if (T==null) return(true);
  else
    return(bisort(T->lchild,max)&&(max<T->data)&&
       bisort(T->rchild,T->data));
}

3 楼

你计算的确实就是节点数,按后序遍历了树每遇到叶节点或左右子树都遍历了的节点h就会加1.

问题出在你的h是全局变量
你试着把
h1=h;
去掉
结果也是一样的
因为
h=max(h1,h)+1; h1不可能大于h

求高度用2楼兄弟的算法就很好啊,
如果非要你写达的那就得解决变量的作用域问题
你自己再看看,应该不难解决


4 楼

感谢3楼的回复,只是你回答的不是我问的东西(参见2楼)。
模拟执行我是没问题的,只是我想知道如何不通过模拟执行来看懂递归程序里面的每一个语句。
另外,你说的变量作用域的问题也是不存在的,下面就是用全局变量h(即累加型)求树的高度的程序:h初始为0;
void high(bitre T);
{
  int n0,n1;
  if (T!=null)
  {
    h++;n0=h;       //先序访问根结点,高度加1,用n0保存T及以
                    //上结点的高度
    high(T->lchild);//将左子树的高度累加到h中
    n1=h;           //用n1保存左子树和T及以上结点的高度
    h=n0;           //将h恢复为T及以上结点的高度
    high(T->rchild);//将右子树的高度累加到h中
    n=max(n1,h);    //取(左子树和T及以上结点的高度)和(右子树和
                    //T及以上结点的高度)的大值即为树的高度
   }
}

5 楼

什么叫
  不通过模拟执行来看懂递归程序里面的每一个语句
递归很容易理解也很容易出错
理解只是说明你知道思路是怎么做的
并不表示就能做出来
因为还有细节的东西要靠技巧
出问题的时候如果不是语法错误
这时候往往就是某个细节出问题
不单步跟踪就不容易看出错在哪
尽管你是天才
这是一种逻辑思维定式
以上只是我个人的观点有不对的地方谢谢指教

6 楼

依然感谢你的回复。
我现在依然有个困惑,如何用[color=FF0000]全局变量[/color](我知道全局变量不要滥用的道理)来实现求二叉树高度的后序遍历的算法(理论上应该是可以写出来的吧)?函数说明就用顶楼的
void high(bitre T);

写出这个程序也许我就可以知道顶楼的程序为什么是错的了。拜托dugulang了!谢谢!

顶楼的最后一段就是我的思路,可惜程序错的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册