主题:求助:如何求一棵二叉树的宽度
zhangystc
[专家分:0] 发布于 2006-05-12 18:47:00
郁闷中,二叉树的宽度不会求,作业交不了。
回复列表 (共10个回复)
沙发
boxertony [专家分:23030] 发布于 2006-05-14 10:41:00
请给出二叉树的宽度的定义
板凳
flysun0311 [专家分:2040] 发布于 2006-05-14 20:48:00
我想你们所说的宽度应该是叶子接点的个数吧!
//以二叉链表作为存储结构,试编写求二叉树中叶子数的算法
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 楼
zhangystc [专家分:0] 发布于 2006-05-14 22:51:00
二叉树的宽度指二叉树的某一层拥有最大的结点个数,那一层最大的结点个数就是二叉树的宽度。
4 楼
boxertony [专家分:23030] 发布于 2006-05-14 23:21:00
我说一下我的方法,就不给你写代码了。
使用队列辅助,把二叉树结点以及结点所在的层号绑定,作为队列的元素类型。
1。首先把根节点及所在层号(设为0)入队列
2。取得队头元素,并把该元素的所有非空子结点(包括对应层号)入队列。在出队列的过程中,逐步统计所有的层号相同的元素个数。一旦层号发生变化,说明开始进入下一层,这样当前层的结点个数也就统计出来了。跟前面已有的的最大结点个数进行比较。当二叉树所有结点都访问完成后,结点最多的层的结点个数也就出来了。
5 楼
zhangystc [专家分:0] 发布于 2006-05-15 13:12:00
将结点所在的层号与结点绑定的确不失为一种好办法,但这样一来,又要去扫描每个结点所在的层数,增加了很大的工作量啊。
6 楼
zhangystc [专家分:0] 发布于 2006-05-15 13:14:00
将结点所在的层号与结点绑定不失为一种好办法,但这样一来又要去扫描结点所在的层号,增加了很大的工作量啊,不知道有没有更好的办法?
7 楼
boxertony [专家分:23030] 发布于 2006-05-15 15:57:00
不用重新扫描,你在一层层往下找的时候就可以逐步绑定了啊。比如根结点层数为0,那么在访问根节点的子结点时所有的子结点层数就都是1,在入队列时就直接一起放进去了,当然就不再需要重新扫描了。在从队列中取出时直接把具有相同层号的结点加到一块就行了。
8 楼
rickone [专家分:15390] 发布于 2006-05-15 17:35:00
[quote]二叉树的宽度指二叉树的[color=FF0000]某一层[/color]拥有最大的结点个数,那一层最大的结点个数就是二叉树的宽度。
[/quote]
到底是哪一层呢?是不是所有层中,宽度最大的就是这棵二叉树的宽度?
用宽搜求,对于入队的结点加入一个层标号,当前处理的层标号为t1,如果某次出队操作得到的结点所在层不等于t1(一个新的层),这个时候队列的长度+1就是新的层的宽度,依此遍历完整棵树就得到了二叉树的宽度.
9 楼
zhangystc [专家分:0] 发布于 2006-05-15 18:28:00
根据各位高手的提示,我想到了一个更容易实现的方法,先建立一个数组,其中每个元素都是结构体的类型,即结点的信息和层数,首先这个数组是空的,然后将二叉树中的元素依次进数组,由于根结点和孩子结点的结点顺序有N=2n和N=2n+1的关系,所以先将树根进数组,然后依次确定其他的元素,每个孩子结点的层数是其父母的加1。
我来回复