二叉树最大宽度


前言

二叉树最大宽度

1.题目解析

给你一棵二叉树的根节点 root ,返回树的 最大宽度 。
树的 最大宽度 是所有层中最大的 宽度 。
每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。
题目数据保证答案将会在 32 位 带符号整数范围内。

在这里插入图片描述
输入:root = [1,3,2,5,3,null,9]
输出:4
解释:最大宽度出现在树的第 3 层,宽度为 4 (5,3,null,9) 。

在这里插入图片描述
输入:root = [1,3,2,5,null,null,9,6,null,7]
输出:7
解释:最大宽度出现在树的第 4 层,宽度为 7 (6,null,null,null,null,null,7) 。

2.算法原理

思路一:

统计每一层的最大宽度,优先想到的就是层序遍历,把当前层节点全部存在队列中,利用队列的长度计算每一层的宽度就可以统计出最大宽度。

空节点也是现需要计算的,将空节点也存放在队列中。
但是在极端场景下,最左边一条长链,最右边一条长链,我们就需要几亿个节点,超出内存限制。
这个思路是错误的

思路二:

依旧是利⽤层序遍历,但是这⼀次队列⾥⾯不单单存结点信息,并且还存储当前结点如果在数组中存储所对应的下标(在我们学习数据结构 - 堆的时候,计算左右孩⼦的⽅式)这样我们计算每⼀层宽度的时候,⽆需考虑空节点,只需将当层结点的左右结点的下标相减再加 1 即可。

但是,这⾥有个细节问题:如果⼆叉树的层数⾮常恐怖的话,我们任何⼀种数据类型都不能存下下标
的值。但是没有问题,因为
• 我们数据的存储是⼀个环形的结构;
• 并且题⽬说明,数据的范围在 int 这个类型的最⼤值的范围之内,因此不会超出⼀圈;
• 因此,如果是求差值的话,我们⽆需考虑溢出的情况。

3.代码编写

class Solution {
public:
    int widthOfBinaryTree(TreeNode* root) 
    {
        queue<pair<TreeNode*,unsigned int>>q;
        if(root==nullptr)
        {
            return 0;
        }
        q.push({root,1});
       unsigned int maxlen=1;
        while(!q.empty())
        {
            int n=q.size();
            unsigned int begin=q.front().second;
            unsigned int end=q.back().second;
            maxlen=max(maxlen,end-begin+1);
            for(int i=0;i<n;i++)
            {
                TreeNode*t=q.front().first;
                if(t->left)
                {
                    q.push({t->left,q.front().second*2});
                }
                if(t->right)
                {
                    q.push({t->right,q.front().second*2+1});
                }
                q.pop();
            }
        }
        return maxlen;
    }
};

总结

以上就是今天要讲的内容。希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘

相关推荐

  1. 106宽度

    2024-06-10 16:40:03       22 阅读
  2. 专题】

    2024-06-10 16:40:03       29 阅读
  3. -力扣

    2024-06-10 16:40:03       5 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-10 16:40:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-10 16:40:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-10 16:40:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-10 16:40:03       20 阅读

热门阅读

  1. C# - 委托与事件

    2024-06-10 16:40:03       7 阅读
  2. 如何进行《我的世界》基于Spigot的插件开发

    2024-06-10 16:40:03       12 阅读
  3. 前端构建工具总结

    2024-06-10 16:40:03       8 阅读
  4. docker部署mysql+nginx+redis

    2024-06-10 16:40:03       8 阅读
  5. 大数据领域的workload是什么意思?

    2024-06-10 16:40:03       9 阅读
  6. “抖动“ 与工作集

    2024-06-10 16:40:03       7 阅读
  7. GPT大模型微调-提高垂直领域回答质量

    2024-06-10 16:40:03       13 阅读
  8. 关于我做了一个python项目的总结

    2024-06-10 16:40:03       6 阅读
  9. Python 编程时可能会遇到各种错误提示

    2024-06-10 16:40:03       11 阅读
  10. Python 中生成器与普通函数的区别

    2024-06-10 16:40:03       10 阅读
  11. 2024.6.10 刷题总结

    2024-06-10 16:40:03       10 阅读
  12. 线程安全应用:

    2024-06-10 16:40:03       8 阅读
  13. 01-今日课程介绍

    2024-06-10 16:40:03       10 阅读