大家讨论一下怎样求一棵二叉树的宽度呢?(最好用递归不用层次遍历)
二叉树宽度的定义是含有结点数最多的那一层上的结点数,曾经看过一些人用递归写的算法,记得当时用的一个静态数组,但不知道静态数组怎么在函数体内进行初始化,
我编写的思想是,首先递归遍历每个结点,再得到当前结点的层次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呢?
如果直接赋值的话,那等于每次地跪调用的时候都初始化一次啊,小弟不才,大家讨论一下呢?
也望多多指教:-)