【LeetCode每日一题】——662.二叉树最大宽度

news2024/9/22 7:08:17

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【题目提示】
  • 七【解题思路】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

  • 广度优先搜索

二【题目难度】

  • 中等

三【题目编号】

  • 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) 。

六【题目提示】

  • 树中节点的数目范围是 [1, 3000]
  • 100 <= Node.val <= 100

七【解题思路】

  • 其实这道题就是二叉树的层序遍历的变种
  • 值得注意的是需要利用完全二叉树的性质
    • 在完全二叉树中,可以将其节点存储到数组中,并且对于序号为i的节点(节点编号从1开始),其
      • 左子节点的序号为i * 2
      • 右子节点的序号为i * 2 + 1
    • 利用以上性质,我们可以将每一层的二叉树的节点编号,用编号值计算每一层的宽度
    • 当计算出每一层的宽度后,就可以计算得到整个二叉树的最大宽度
  • 具体细节请参考下面的代码

八【时间频度】

  • 时间复杂度: O ( n ) O(n) O(n) n n n为传入的二叉树的节点个数
  • 空间复杂度: O ( n ) O(n) O(n) n n n为传入的二叉树的节点个数

九【代码实现】

  1. Java语言版
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */

class Solution {
    public int widthOfBinaryTree(TreeNode root) {
        // 最小宽度为1
        int res = 1;

        // 初始化队列,queue用于存储当前层节点
        List<Pair<TreeNode, Integer>> queue = new ArrayList<Pair<TreeNode, Integer>>();
        queue.add(new Pair<TreeNode, Integer>(root, 1));

        // 使用广度优先遍历算法计算二叉树的最大高度
        while (!queue.isEmpty()) {

            // temp用于存储下一层节点
            List<Pair<TreeNode, Integer>> temp = new ArrayList<Pair<TreeNode, Integer>>();

            for (Pair<TreeNode, Integer> pair : queue) {
                TreeNode node = pair.getKey();
                int index = pair.getValue();
                if (node.left != null) {
                    temp.add(new Pair<TreeNode, Integer>(node.left, index * 2));
                }
                if (node.right != null) {
                    temp.add(new Pair<TreeNode, Integer>(node.right, index * 2 + 1));
                }
            }

            // 计算二叉树的最大宽度
            res = Math.max(res, queue.get(queue.size() - 1).getValue() - queue.get(0).getValue() + 1);
            queue = temp;
        }

        // 返回结果
        return res;
    }
}
  1. Python语言版
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def widthOfBinaryTree(self, root: Optional[TreeNode]) -> int:
        # 最小宽度为1
        res = 1
        
        # 初始化队列,queue用于存储当前层节点
        queue = [[root, 1]]

        # 使用广度优先遍历算法计算二叉树的最大高度
        while queue:

            # temp用于存储下一层节点
            temp = []

            for node, index in queue:
                if node.left:
                    temp.append([node.left, index * 2])
                if node.right:
                    temp.append([node.right, index * 2 + 1])
            
            # 计算二叉树的最大宽度
            res = max(res, queue[-1][1] - queue[0][1] + 1)
            queue = temp

        # 返回结果
        return res
  1. C语言版
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

// 节点最多3000个
#define MAX_NODE_SIZE 3000

// 比较大小
#define MAX(a, b) ((a) > (b) ? (a) : (b));

// 利用完全二叉树的性质存储二叉树,node保留了节点的左右子树的关系,index记录节点(在数组中)的位置(索引)
typedef struct
{
    struct TreeNode* node;
    unsigned long long index;
} levelNode;

int widthOfBinaryTree(struct TreeNode* root)
{
    // 最小宽度为1
    unsigned long long res = 1;

    // 初始化队列,queue用于存储当前层节点,temp用于存储下一层节点
    levelNode* queue = (levelNode*)malloc(sizeof(levelNode) * MAX_NODE_SIZE);
    levelNode* temp = (levelNode*)malloc(sizeof(levelNode) * MAX_NODE_SIZE);
    int queueSize = 0;
    int tempSize = 0;
    
    // 根节点入队列
    queue[queueSize].node = root;
    queue[queueSize++].index = 1LL;

    // 使用广度优先遍历算法计算二叉树的最大宽度
    while (queueSize > 0)
    {
        // 将当前节点的所有下一层节点按照完全二叉树的索引值存储
        tempSize = 0;
        for (int i = 0; i < queueSize; i++)
        {
            if (queue[i].node->left)
            {
                temp[tempSize].node = queue[i].node->left;
                temp[tempSize++].index = queue[i].index * 2;
            }
            if (queue[i].node->right)
            {
                temp[tempSize].node = queue[i].node->right;
                temp[tempSize++].index = queue[i].index * 2 + 1;
            } 
        }
        // 计算二叉树的最大宽度
        res = MAX(res, queue[queueSize - 1].index - queue[0].index + 1);
        
        // 将存储当前层节点信息的队列重新赋值为存储好的下一层节点的信息队列
        queueSize = tempSize;
        levelNode* change = queue;
        queue = temp;
        temp = change;
    }
    // 返回结果
    return res;
}

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. Python语言版
    在这里插入图片描述

  3. C语言版
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《python语言程序设计》2018版第7章第05题几何:正n边形,一个正n边形的边都有同样的长度。角度同样 设计RegularPolygon类

结果和代码 这里只涉及一个办法 方法部分 def main():rX, rY eval(input("Enter regular polygon x and y axis:"))regular_num eval(input("Enter regular number: "))side_long eval(input("Enter side number: "))a exCode07.RegularPol…

C++入门——01类与对象

1.类 1.1.类的引入 C语言中&#xff0c;结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 struct Student {void SetStudentInfo(const char* name, const char* gender, int age){strcpy(_name, name);strcpy(_gen…

微信公众号批量上传、发布文章管理系统(Python版)

功能亮点 一键批量操作文章自动排版支持自定义文章数量适用于多号操作支持文章管理、查询、查看支持查询当前状态 适用对象 公众号运营批量文章上传发布矩阵号管理 部分关键代码及步骤 微信公众号后台的设置与开发栏目中的基本配置里获取appid和appsecret。 获取微信公众号…

软件测试 - 测试用例(设计测试用例的思路、万能公式、测试用例设计的方法)

一、测试用例 1.1 概念 测试用例&#xff08; Test Case &#xff09;是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环 境、操作步骤、测试数据、预期结果等要素。 1.2 编写测试用例 1&#xff09;excel 表格编写 笔试题的测试用例…

【Nginx】Nginx 安装(平滑升级和回滚)

一、 Nginx 概述 Nginx 介绍 Nginx &#xff1a; engine X &#xff0c; 2002 年开发&#xff0c;分为社区版和商业版 (nginx plus ) 2019 年 3 月 11 日 F5 Networks 6.7 亿美元的价格收购 Nginx 是免费的、开源的、高性能的 HTTP 和反向代理服务器、邮件代理服务器、以…

路由器VLAN配置(H3C)

路由器VLAN配置&#xff08;H3C&#xff09; 控制页面访问 路由器默认处于192.168.1.1网段&#xff08;可以短按reset重置&#xff09;&#xff0c;如果要直接使用需要设置静态IP处于同一网段&#xff1b; 对路由器进行配置也要将电脑IP手动设置为同一网段&#xff1b; 默…

音频剪辑软件哪个好用?五大音频剪辑软件分享

如果你正打算在家自学视频制作&#xff0c;那么恭喜你&#xff0c;你已经踏上了一段充满魔法与惊喜的旅程&#xff01;不过&#xff0c;别忘了&#xff0c;视频的灵魂不仅仅在于画面&#xff0c;更在于那直击心灵的音效。 想象一下&#xff0c;一个精心剪辑的片段&#xff0c;…

如何拯救非正常专利申请?

在无忧专利微信公众号2023年年初的一篇文章中提到&#xff0c;出于提质增效的考虑&#xff0c;专利局加大了对非正常申请的打击力度。 专利局打击非正常申请的方式包括&#xff1a;建立黑名单、启用新的业务办理系统、使用大数据识别技术、惩罚非正常申请和非正常代理行为。 …

Vehicle Perception from Satellite(2024 TPAMI 卫星视频车流量监控)

Vehicle Perception from Satellite&#xff08;2024 TPAMI 卫星视频车流量监控&#xff09; 前言1.1 动机1.2 概述1.3 贡献 2 相关工作2.1 遥感中的目标检测2.2 计算机视觉中的相关任务2.3 卫星交通监控 3 TMS 数据集3.1 数据收集与预处理3.2 数据统计3.3 应用任务 4 实验4.1 …

C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧

文章目录 &#x1f4dd;基本框架&#x1f320; 构造和销毁&#x1f309;vector()&#x1f309;vector(const vector& v)&#x1f309;vector(size_t n, const T& value T())&#x1f309;赋值拷贝构造&#xff1a;vector<T>& operator(vector<T> v)&a…

XSS的DOM破坏

目录 1、DOM破坏案例解释 1.1先写一个demo.html文件 1.2、执行demo&#xff0c;看到是否将全部移除%20scr1%20οnerrοralert(1)> 分析&#xff1a; 解决&#xff1a;把两个for不在同一个数组进行操作 1.3、接下来我们要想办法让第二个for循环不能删除&#xff0c;留下…

android FD_SET_chk问题定位

android FD_SET_chk问题定位 一、FD报错二、问题定位2.1 APM定位2.2 adb定位2.3. 代码获取FD数 三、FD优化 一、FD报错 App在运行中记录报错如下&#xff0c;FD_SET&#xff0c;这个问题大概是文件描述符&#xff08;File Descriptor&#xff0c;简称FD&#xff09;超过了最大…

首款会员制区块链 Geist 介绍

今天&#xff0c;Pixelcraft Studios 很高兴地宣布即将推出 Geist&#xff0c;这是一个由 Base、Arbitrum、Alchemy 以及 Aavegotchi 支持的全新 L3。 Geist 之前的代号为 “Gotchichain”&#xff0c;是首个专为游戏打造的会员专用区块链。 为什么选择 Geist&#xff1f; …

Spring DI 简单演示三层架构——Setter 注入

Spring IOC 的常见注入方法有3种&#xff1a;Setter注入、构造注入和属性注入。想了解更多可点击链接&#xff1a;Spring 注入、注解以及相关内容补充 属性注入 不推荐。原因&#xff1a;使用私有的成员属性变量&#xff0c;依靠反射实现&#xff0c;破坏封装&#xff0c;只能依…

~Keepalived高可用集群~

一、Keepalived简介 是一个用于实现高可用性的解决方案&#xff0c;它主要应用于云主机的主备切换&#xff0c;以达到高可用性&#xff08;HA&#xff09;的目的。当主服务器发生故障无法对外提供服务时&#xff0c;动态将虚拟IP切换到备服务器&#xff0c;继续对外提供服务&a…

DOM破坏

XSS Game 1、第一关 Ma Spaghet! <!-- Challenge --> <h2 id"spaghet"></h2> <script>spaghet.innerHTML (new URL(location).searchParams.get(somebody) || "Somebody") " Toucha Ma Spaghet!" </script> S…

【ubuntu24.04】wget配置代理加速下载

参考之前的wget代理配置 wget速度非常慢 配置控制台代理不行 配置wget代理 本机部署了代理程序:all_proxy 不识别:root@PerfSvr:~# cat set65proxy.sh #!/bin/sh export

[STM32F429_硬件知识01]

知识点1 &#xff1a;J-Link的使用步骤&#xff1a; step1 : 安装J-Link驱动程序 step2 : keil的魔术棒中 -> Debug -> Use中选择J_Link ->点击 Settings ->

AI 时代风暴:程序员的核心竞争力大揭秘

引言&#xff1a; 在当今科技浪潮以排山倒海之势汹涌澎湃之际&#xff0c;人工智能宛如璀璨星辰般不断涌现&#xff0c;AIGC&#xff08;如 chatgpt、midjourney、claude 等&#xff09;大语言模型如雨后春笋般破土而出&#xff0c;AI 辅助编程工具更是以风驰电掣之速迅速席卷编…

智能电销机器人提升工作效率

随着科技的不断发展&#xff0c;电销行业也在不断探索创新&#xff0c;其中电销机器人作为一种高效的工具&#xff0c;正逐渐成为企业提升工作效率的利器。让我们一起看看电销机器人如何助力企业提高效率&#xff1a; 1. 自动化拨打电话 电销机器人每天可以自动拨打大量电话&a…