void Treelevelmax(bitree T,LQueue qa, int &sum)//求二叉树宽度
{
LQueue z;
InitQueue(z);
bitree p;
int temp=0;
while (!QueueEmpty(qa)){
DeQueue(qa,p);
if(p->left!=NULL)EnQueue(z,p->left);temp++;
if(p->right!=NULL)EnQueue(z,p->right);temp++;
}
while(!QueueEmpty(z)){
DeQueue(z,p);
char a=p->data;
printf("%c",a);}
sum=sum>=temp?sum:temp;
if(!QueueEmpty(z)){
qa=z;
Treelevelmax(T,qa,sum);}
else return ;
}
这段代码有一个问题,在第一个 while 中,会对左右子节点进行多次重复累计,会导致求得不是二叉树的真实宽度。
下面是一种求二叉树宽度的方法,使用层次遍历,并记录每一层的节点数,取最大值即为二叉树的宽度。
int maxWidth(TreeNode *root) {
if(!root) return 0;
queue<TreeNode*> q;
q.push(root);
int res = 0;
while(!q.empty()) {
int size = q.size();
res = max(res, size);
while(size--) {
auto t = q.front(); q.pop();
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
}
return res;
}
该代码中,使用了STL库中的queue,每次从队列中出队当前节点,并将当前节点的左右子节点加入队列中,累计节点数时只需在记录当前层节点数时记录队列长度即可。
这样就可以得到二叉树的真实宽度了。
我也没想到竟然成功了。之前一直出错。经常出的两种错误是:
run: line 1: 3 Segmentation fault
run: line 1: 3 Killed LD_LIBRARY_PATH=/usr/local/gcc-9.2.0/lib64 ./a.out Exi
尤其是第一类,一直也找不到原因。刚刚改了一下,好像可以了。主要就是清空了qa对列,并且加了&的引用。然后就没有再报错了。希望对其他小白有帮助吧