回 帖 发 新 帖 刷新版面

主题:求助:如何求一棵二叉树的宽度

郁闷中,二叉树的宽度不会求,作业交不了。

回复列表 (共10个回复)

沙发

请给出二叉树的宽度的定义

板凳

我想你们所说的宽度应该是叶子接点的个数吧!
//以二叉链表作为存储结构,试编写求二叉树中叶子数的算法
int LeafCount1(bitree T)   
{
    int i,j;
   if(!T) return 0;                     //空树没有叶子 
  else if(T->lchild==NULL&&T->rchild==NULL) 
  {
      return 1; //叶子结点
  }
  
  else 
  {
      i=LeafCount1(T->lchild);
      j=LeafCount1(T->rchild);
          return (i+j);
  }
   //左子树叶子数加上右子树叶子数 
}

//以二叉链表作为存储结构,试编写求二叉树中叶子数的算法。
int num=0;
void  LeafCount2(bitree T)   
{
    
    if(T) 
    {LeafCount2(T->lchild) ;  //中序遍历左子树
      if(!T->lchild && !T->rchild)  num++; //访问根结点
     LeafCount2(T->rchild) ; //中序遍历右子树
     }
    
}

3 楼

二叉树的宽度指二叉树的某一层拥有最大的结点个数,那一层最大的结点个数就是二叉树的宽度。

4 楼

我说一下我的方法,就不给你写代码了。

使用队列辅助,把二叉树结点以及结点所在的层号绑定,作为队列的元素类型。
1。首先把根节点及所在层号(设为0)入队列
2。取得队头元素,并把该元素的所有非空子结点(包括对应层号)入队列。在出队列的过程中,逐步统计所有的层号相同的元素个数。一旦层号发生变化,说明开始进入下一层,这样当前层的结点个数也就统计出来了。跟前面已有的的最大结点个数进行比较。当二叉树所有结点都访问完成后,结点最多的层的结点个数也就出来了。

5 楼

将结点所在的层号与结点绑定的确不失为一种好办法,但这样一来,又要去扫描每个结点所在的层数,增加了很大的工作量啊。

6 楼

将结点所在的层号与结点绑定不失为一种好办法,但这样一来又要去扫描结点所在的层号,增加了很大的工作量啊,不知道有没有更好的办法?

7 楼

不用重新扫描,你在一层层往下找的时候就可以逐步绑定了啊。比如根结点层数为0,那么在访问根节点的子结点时所有的子结点层数就都是1,在入队列时就直接一起放进去了,当然就不再需要重新扫描了。在从队列中取出时直接把具有相同层号的结点加到一块就行了。

8 楼

[quote]二叉树的宽度指二叉树的[color=FF0000]某一层[/color]拥有最大的结点个数,那一层最大的结点个数就是二叉树的宽度。
[/quote]
到底是哪一层呢?是不是所有层中,宽度最大的就是这棵二叉树的宽度?
用宽搜求,对于入队的结点加入一个层标号,当前处理的层标号为t1,如果某次出队操作得到的结点所在层不等于t1(一个新的层),这个时候队列的长度+1就是新的层的宽度,依此遍历完整棵树就得到了二叉树的宽度.

9 楼

根据各位高手的提示,我想到了一个更容易实现的方法,先建立一个数组,其中每个元素都是结构体的类型,即结点的信息和层数,首先这个数组是空的,然后将二叉树中的元素依次进数组,由于根结点和孩子结点的结点顺序有N=2n和N=2n+1的关系,所以先将树根进数组,然后依次确定其他的元素,每个孩子结点的层数是其父母的加1。
    

10 楼

hao

我来回复

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