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

【C++算法】72.队列+宽搜_二叉树的最大宽度

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:


题目链接:

662. 二叉树最大宽度


题目描述:

096c1cae6feb2a1ea6b7aed3645172a0


解法

这里的宽度指的是一层的最右边的非空节点到一层的最左边的非空节点,一共的节点数。

解法一:硬来(会超时,因为可能会有3000个数的左右各1500个节点的最恶心的情况)

仿照之前的层序遍历,把空节点也加进去。(要注意,遇到空节点要添加两个空孩子)

解法二:利用数组存储二叉树的方式,给节点编号。

宽度就是这个队列的队尾和队头相减再加一。

也可以直接搞一个数组来模拟。

83149bd7a0840080035ca356ddca32bc

36d91dbaca53c224c69a08e3c31c482a

注意细节:下标有可能会溢出。

不过当我们相减之后,即使溢出,结果也是正确的。因为存储实际上是一个环,所以我们可以使用无符号整数来存储。


C++ 算法代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;              // 节点值*     TreeNode *left;       // 左子节点指针*     TreeNode *right;      // 右子节点指针*     TreeNode() : val(0), left(nullptr), right(nullptr) {}             // 默认构造函数*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}        // 带值的构造函数*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}  // 完整构造函数* };*/
class Solution 
{
public:int widthOfBinaryTree(TreeNode* root) {// 计算二叉树最大宽度算法// 基本思路:使用层序遍历,同时为每个节点分配位置编号// 宽度定义为:每一层最右边节点与最左边节点的位置差+1// 使用数组模拟队列,存储节点和其位置编号// 使用unsigned int避免大数时可能的整数溢出vector<pair<TreeNode*, unsigned int>> q;q.push_back({root, 1});  // 根节点入队,位置编号为1unsigned int ret = 0;    // 存储最大宽度结果while(q.size())  // 只要队列不为空,就继续处理{// 计算当前层的宽度:最右节点位置减去最左节点位置再加1auto& [x1, y1] = q[0];       // 当前层最左边的节点x1及其位置y1auto& [x2, y2] = q.back();   // 当前层最右边的节点x2及其位置y2ret = max(ret, y2 - y1 + 1); // 更新最大宽度// 准备处理下一层节点vector<pair<TreeNode*, unsigned int>> tmp; // 临时数组,存储下一层的节点// 遍历当前层的所有节点,将其子节点加入到下一层for(auto& [x, y] : q){// 关键:为子节点分配位置编号// 左子节点的位置是父节点位置的2倍if(x->left) tmp.push_back({x->left, y * 2});// 右子节点的位置是父节点位置的2倍加1if(x->right) tmp.push_back({x->right, y * 2 + 1});}q = tmp;  // 更新队列,准备处理下一层}return ret;  // 返回最大宽度}
};
http://www.xdnf.cn/news/1209025.html

相关文章:

  • adb reboot 与 adb shell svc power reboot 的区别
  • 【C++】1. C++基础知识
  • 【HTML】浅谈 script 标签的 defer 和 async
  • 企业高性能web服务器
  • EnergyMath芯详科技 EMS4100/MES4000/MES3900
  • 如何保证DoIP的网络安全?
  • 基于 xlsx-js-style 的 Excel 导出工具实现导出excel
  • 40+个常用的Linux指令——下
  • haproxy应用详解
  • 从github同步新项目的两次挫折-2025.7.29
  • 【WRF工具】服务器中安装编译GrADS
  • 信创国产Linux操作系统汇总:从桌面到服务器,百花齐放
  • 【Golang】Go语言Map数据类型
  • 随缘玩 一: 代理模式
  • 计算器4.0:新增页签功能梳理页面,通过IO流实现在用户本地存储数据
  • MySQL数据库 mysql常用命令
  • 再谈亚马逊云科技(AWS)上海AI研究院7月22日关闭事件
  • 实现视频实时马赛克
  • P1098 [NOIP 2007 提高组] 字符串的展开
  • python案例:基于python 神经网络cnn和LDA主题分析的旅游景点满意度分析
  • 小程序中事件对象的属性与方法
  • 微算法科技(NASDAQ:MLGO)应用区块链联邦学习(BlockFL)架构,实现数据的安全传输
  • Django自带的加密算法
  • 3D游戏引擎的“眼睛“:相机系统深度揭秘与技术实现
  • 14、distance_object_model_3d算子
  • 如何用命令行快速提取PPT中的所有图片?
  • 线程崩溃是否导致进程崩溃
  • 【嵌入式电机控制#18】有刷直流串级控制
  • MySQL图解索引篇
  • 大模型技术对部分岗位的影响