啊君的窝牛 2023-01-20 21:23 采纳率: 50%
浏览 54
已结题

求二叉树宽度,递归错误

求二叉树宽度
无法递归
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 ;
    
}    

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
采用双对列方法,qa和z ,qa取根节点,z取根节点的左右节点并累计求和。以此类推,求出每一层的节点和,并比较大小,取最大值
我的解答思路和尝试过的方法
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

img

  • 写回答

2条回答 默认 最新

  • 「已注销」 2023-01-20 21:44
    关注

    这段代码有一个问题,在第一个 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,每次从队列中出队当前节点,并将当前节点的左右子节点加入队列中,累计节点数时只需在记录当前层节点数时记录队列长度即可。

    这样就可以得到二叉树的真实宽度了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月28日
  • 已采纳回答 1月20日
  • 创建了问题 1月20日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分