当前位置: 首页 > news >正文

BFS(七)662. 二叉树最大宽度 数组下标模拟存储二叉树

662. 二叉树最大宽度

给你一棵二叉树的根节点 root ,返回树的 最大宽度

树的 最大宽度 是所有层中最大的 宽度

每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。

题目数据保证答案将会在  32 位 带符号整数范围内。

示例 1:

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

示例 2:

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

示例 3:

输入:root = [1,3,2,5]
输出:2
解释:最大宽度出现在树的第 2 层,宽度为 2 (3,2) 。

 最初版本,没有理解题意,直接使用队列计算每行最多的元素,也就是每层最多多少个结点。

class Solution {
public:
    int widthOfBinaryTree(TreeNode* root) {
        int maxwid = 0;
        queue<TreeNode*> q;
        if(root)
            q.push(root);
        while(!q.empty())
        {
            int size = q.size();
            maxwid = max(size, maxwid);
            while(size--)
            {
                TreeNode* cur = q.front();
                q.pop();
                if(cur->left)
                    q.push(cur->left);
                if(cur->right)
                    q.push(cur->right);
            }
        }
        return maxwid;
    }
};

实际上是有问题的,这道题是包含了以下这些红色空节点在内的。从 6 到 7 加上中间空节点来计算这个二叉树最大的宽度。

思路一:插入空节点

仍旧使用上述的代码,只是在判断左右孩子是否存在时,再为空的情况下做一个插入一个空节点这样的方式来进行。每访问一层的时候使用empty变量来记录当前层空节点个数,以此来计算最大宽度,不过出现右边这个图的情况下就会溢出。

思路二:利用数组存储二叉树的方式,给节点进行编号

使用数组存储二叉树的方式,给结点进行编号(联想完全二叉树、堆使用数组来进行下标访问),如果有下标的情况下,那么求第四层的宽度就可以直接使用 15-8+1   第三层:7-4+1  m-n+1

 队列中存放结点为一个键值对pair类型,first为二叉树结点指针,second为二叉树数组顺序下标。


class Solution {
public:
    int widthOfBinaryTree(TreeNode* root) {
        queue<pair<TreeNode*, unsigned int>> q;
        由于数字溢出使用 unsigned int 类型
        unsigned int maxwid = 0;
        if(root)
            q.push(pair(root, 1));
        while(!q.empty())
        {
            1、确定队头队尾之间的宽度并更新maxwid
            auto fro = q.front();
            auto bac = q.back();
            maxwid = max(maxwid, bac.second - fro.second + 1);
            
            2、一层一层的进行插入队列
            int size = q.size();
            while(size--)
            {
                auto cur = q.front();
                q.pop();
                if(cur.first->left)
                    q.push(pair(cur.first->left, 2 * cur.second));
                if(cur.first->right)
                    q.push(pair(cur.first->right, 2 * cur.second + 1));
            }
        }
        return maxwid;
    }
};

总结:这道题算是熟练掌握auto、pair键值对中对于first、second的访问与运算、无符号整形来控制溢出、队列、二叉树顺序存储,很不错挺综合的一道题目。有种考研后期刷线代、高数综合大题的感觉了

相关文章:

  • “深入浅出”系列之杂谈篇:(8)SQL Server 真的比不上 MySQL 吗?
  • 大模型中的剪枝、蒸馏是什么意思?
  • 【mlops】Cube Studio云原生机器学习平台架构解析
  • unity 让两个物体相遇时候刚体互不影响
  • Python计算程序用时方法大全(基础,高精度,装饰器,无侵入式,格式化时间输出)
  • K8s 1.27.1 实战系列(五)Namespace
  • GEFFEN/GF-SPMS8分布式电源强电控制器
  • 【408考研网络】2024考研原题计算机网络知识点总结(共六题)
  • 维度建模维度表技术基础解析(以电商场景为例)
  • linux上将sh脚本文件打包成二进制程序文件
  • 深入探究LLamaFactory推理DeepSeek蒸馏模型时无法展示<think>思考过程的问题
  • 微电网协调控制器ACCU-100 分布式光伏 光储充一本化
  • 驭码CodeRider 闪电适配阿里QwQ-32B:8小时全栈集成,AI编程效率飞跃!
  • 关于tomcat使用中浏览器打开index.jsp后中文显示不正常是乱码,但英文正常的问题
  • Android Coil总结
  • AI是否可以实现全自动的生成内容,看看我的想法
  • 【连珠云弈】网页五子棋版项目测试报告
  • DeepSeek-R1:使用KTransformers实现高效部署指南
  • cs144 Lab Checkpoint 0: networking warmup
  • 使用 Arduino 和 Wi-Fi 控制 RGB LED
  • 新型基因编辑工具可精准嵌入完整基因
  • 凤阳文旅局回应鼓楼瓦片脱落:鼓楼楼宇系仿古建筑,动工时已履行报批手续
  • 22国外长联合声明:要求以方立即允许全面恢复对加沙援助
  • 自然资源部:适应存量时代城市更新发展,严控增量盘活存量
  • AI快速迭代带来知识焦虑,褚君浩院士提出“四维能力模型”
  • 解放日报:“感觉全世界人都在上海买买买”