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

力扣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) 。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


#define MAX_NUM 20000

int widthOfBinaryTree(struct TreeNode* root) {
    // 如果根节点为空,说明是空树,其宽度为0,直接返回0
    if (root == NULL) {
        return 0;
    }

    // 定义一个数组作为队列,用于存储二叉树节点指针,实现层序遍历等操作
    // 这里假设队列最多能容纳MAX_NUM个节点
    struct TreeNode *q[MAX_NUM];

    // 由于直接在原节点的val值上记录编号可能会超出int范围(对于某些用例),
    // 所以定义一个无符号长整型数组作为辅助数组,用于记录每个节点的编号
    unsigned long long Q[MAX_NUM];

    // 初始化队列头部索引为0
    int front = 0;

    // 初始化队列尾部索引为0
    int rear = 0;

   
    // root->val = 0;

    // 将根节点的编号初始化为1,存储到辅助数组Q中
    Q[rear] = 1;

    // 将根节点入队,作为层序遍历的起始点
    q[rear++] = root;

    // 初始化最大宽度为0,用于在遍历过程中记录遇到的最大宽度值
    int max = 0;

    // 当队列不为空时,进行层序遍历及相关计算
    while (front < rear) {
        // 计算当前层的宽度,这里通过每层最后一个节点的编号减去第一个节点的编号再加1来得到
        // 原先是通过节点的val值来计算,但存在可能超出int范围的问题,现在使用辅助数组Q中的编号来计算
        max = fmax(max, Q[rear - 1] - Q[front] + 1);

        // 本层所有元素出队,同时将子节点入队,并为子节点赋值正确的编号
        int curLevelSize = rear - front;
        for (int i = 0; i < curLevelSize; i++) {
            // 获取当前出队节点的编号
            unsigned long long idx = Q[front];

            // 将当前节点出队
            struct TreeNode *node = q[front++];

            // 如果当前节点的左子节点不为空,为左子节点计算编号并将其入队
            if (node->left!= NULL) {
                // 左子节点的编号为父节点编号乘以2
                Q[rear] = idx * 2;
                q[rear++] = node->left;
            }

            // 如果当前节点的右子节点不为空,为右子节点计算编号并将其入队
            if (node->right!= NULL) {
                // 右子节点的编号为父节点编号乘以2再加1
                Q[rear] = idx * 2 + 1;
                q[rear++] = node->right;
            }
        }
    }

    // 返回计算得到的二叉树的最大宽度
    return max;
}


http://www.kler.cn/a/393380.html

相关文章:

  • C++第五六单元测试
  • leetcode hot 100 二叉搜索
  • 基于SpringBoot的“房产销售平台”的设计与实现(源码+数据库+文档+PPT)
  • 【Ubuntu 20.4安装截图软件 flameshot 】
  • c#中using语句
  • uniapp 文本转语音
  • Java面向对象编程进阶之包装类
  • Python---re模块(正则表达式)
  • 快递鸟快递查询API接口参数代码
  • 字符设备 - The most important !
  • JavaScript 中实例化生成对象的相关探讨
  • JVM 中的完整 GC 流程
  • 电信网关配置管理后台 upload_channels.php 任意文件上传漏洞复现
  • IntelliJ IDEA设置打开文件tab窗口多行展示
  • 使用Cesium for Unreal与Cesium ion构建3D地理空间应用教程
  • PHP运算符
  • 使用React和Vite构建一个AirBnb Experiences克隆网站
  • 父子线程间传值问题以及在子线程或者异步情况下使用RequestContextHolder.getRequestAttributes()的注意事项和解决办法
  • 数据分析——学习框架
  • Overleaf数学符号乱码等问题
  • ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案
  • 10 Oracle Data Guard:打造高可用性与灾难恢复解决方案,确保业务连续性
  • Sql server 备份还原方法
  • 鸿蒙系统(HarmonyOS)介绍
  • CISSP首战失利与二战逆袭
  • 【debug记录】MATLAB内置reshape与Python NumPy库reshape的差异