| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10262 人关注过本帖
标题:大家讨论一下怎样求一棵二叉树的宽度呢?(最好用递归不用层次遍历)
只看楼主 加入收藏
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
结帖率:100%
收藏
 问题点数:0 回复次数:7 
大家讨论一下怎样求一棵二叉树的宽度呢?(最好用递归不用层次遍历)
二叉树宽度的定义是含有结点数最多的那一层上的结点数,
曾经看过一些人用递归写的算法,记得当时用的一个静态数组,但不知道静态数组怎么在函数体内进行初始化,

我编写的思想是,首先递归遍历每个结点,再得到当前结点的层次i,这样通过辅助数组count[i]++,就可以得到
第i层上结点的个数,最后,求这个数组里的最大值就可以了,这个最大值就是二叉树的宽度了.代码已经调通了如下:

//////////////////////////////////////////////////
//FindWidth()公有成员函数
//求子树subTree的宽度,二叉树的宽度就是结点数最多
//的那层上的结点的个数,i是层次开始的层次数,
//count数组用于记录各层上的结点个数
//////////////////////////////////////////////////
template<class T>
void BinaryTree<T>::FindWidth(BinTreeNode<T>* subTree
                             ,int* count,int i=0)
{
    if(subTree!=NULL)
    {
        count[i]++;
        FindWidth(subTree->leftChild,count,i+1);
        FindWidth(subTree->rightChild,count,i+1);
    };
};
///////////////////////////////FindWidth()函数结束

/////////////////////////////////////////////////
//FindWidth()
//找出当前的二叉树的宽度
/////////////////////////////////////////////////
template<class T>
int BinaryTree<T>::FindWidth()
{
    int dep=Height();             //当前二叉树的深度
    int* count=new int[dep];      //按照当前二叉树的深度来开辟数组
    for(int i=0;i<dep;i++)
        count[i]=0;               //把计数数组先初始化为0
    FindWidth(root,count,0);
    int max=0;
    for(i=0;i<dep;i++)            //找出最大宽度
        if(max<count[i])
            max=count[i];
    return max;
};
//////////////////////////////FindWidth()函数结束

可问题是,如果只写一个递归函数,就直接求出二叉树的宽度,这样该怎么写呢?
我觉得count[]数组可以定义成一个静态数组,可我怎么把它的所有元素在函数体内初始化为0呢?
如果直接赋值的话,那等于每次地跪调用的时候都初始化一次啊,小弟不才,大家讨论一下呢?
也望多多指教:-)
搜索更多相关主题的帖子: 二叉树 遍历 递归 宽度 
2008-10-25 17:31
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
啊,我突然有点明目了,
是不是如果把数组这样初始化就没事了?
static int count[10]={0,0,0,0,0,0,0,0,0,0};

而可以避免如下的初始化带来的烦恼:
static int count[10];
for(int i=0;i<10;i++)
    count[i]=0;

我马上试验一下...

望各位高手讨论指教啊!
2008-10-25 17:39
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
大家讨论一下啊?
2008-10-27 13:41
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
分支限界法+计数

倚天照海花无数,流水高山心自知。
2008-10-27 21:39
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
请教一下斑竹大人,分支限界法是不是从一个结点向下层过渡的时候,看孩子的数目,
来确定下层结点数是增加多少或者减少多少?能否给俺详细解释一下,谢谢啦!
2008-10-28 11:38
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
分支限界其实就和模拟队列差不多了。
回溯是深度搜索
而分支就是广度

倚天照海花无数,流水高山心自知。
2008-10-29 19:52
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
那是不是用了分支界定,递归就不太好用了啊?
觉得好像涉及到广度的,好像都不太好用递归啊?
2008-10-29 21:50
missiyou
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:531
专家分:218
注 册:2007-10-9
收藏
得分:0 
递归也好做啊,
不过我觉得非递归会更好控制一些变量。
2008-10-29 22:09
快速回复:大家讨论一下怎样求一棵二叉树的宽度呢?(最好用递归不用层次遍历)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025078 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved