二叉树的宽度实际上很好求,用层序遍历就可以解决,具体看下面代码的注释,懒得讲解了哈哈哈哈哈哈哈哈哈
int Width(tree *t)
{
if(t!=NULL)
{
tree *queue[MAXSIZE]; //这里创建队列
int front=0,rear=0; //front记住头结点、rear队列尾部
int MAX=0; //树的宽度临时存储
queue[++rear]=t; //根节点进队
while(t!=NULL&&front!=rear) //树为空或者队列为空的时候弹出循环
{
int n=rear-front; //这里n就是各层宽度,第一层为1,因为只有根节点
if(n>MAX)
{
MAX=rear-front; //MAX记录最大的宽度
}
for(int i=0;i<n;i++) //进入循环先把一层遍历完,加进队列里面
{
t=queue[++front];
if(t->left!=NULL) //左子树不为空加队
{
queue[++rear]=t->left;
}
if(t->right!=NULL) //右子树不为空加队
{
queue[++rear]=t->right;
}
}
}
return MAX; //这里是上面的树遍历完毕弹出,返回最大max
}else
{
return NULL;
}
}