LeetCode559. N 叉树的最大深度

news2024/11/14 3:47:35

559. N 叉树的最大深度

文章目录

      • [559. N 叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-n-ary-tree/)
        • 一、题目
        • 二、题解
          • 方法一:迭代
          • 方法二:递归


一、题目

给定一个 N 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。

示例 1:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3zxgquwK-1690602172723)(D:\A_WHJ\Computer Science\typora图片\narytreeexample-1690601625198-1.png)]

输入:root = [1,null,3,2,4,null,5,6]
输出:3

示例 2:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ug4THj9u-1690602172724)(D:\A_WHJ\Computer Science\typora图片\sample_4_964-1690601625198-3.png)]

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:5

提示:

  • 树的深度不会超过 1000
  • 树的节点数目位于 [0, 104] 之间。

二、题解

方法一:迭代

题目要求计算一棵多叉树的最大深度,也就是树的高度。我们可以使用广度优先搜索(BFS)来解决这个问题。让我们一步一步地详细解释这个算法。

算法思路

  1. 我们从根节点开始,使用队列来进行广度优先搜索。
  2. 首先将根节点入队,然后进入循环,直到队列为空。
  3. 在循环中,我们首先记录当前队列中的节点个数(这是因为在每一层循环时,队列中的节点都属于同一层,我们需要控制循环的次数)。
  4. 接下来,我们对当前层的所有节点进行处理:
    • 从队列中取出一个节点,然后将它的子节点(如果有的话)入队。
    • 在处理完当前层的所有节点后,我们的深度+1,表示我们进入了下一层。
    • 继续下一次循环,直到队列为空,这时候我们遍历完了整个多叉树,并得到了最大深度。

具体实现

class Solution {
public:
    int maxDepth(Node* root) {
        // 创建一个队列用于广度优先搜索
        queue<Node*> que;
        
        // 如果根节点非空,则将根节点入队
        if (root != nullptr)
            que.push(root);
        
        // 初始化深度为0
        int depth = 0;
        
        // 开始广度优先搜索
        while (!que.empty()) {
            // 记录当前层的节点个数
            int size = que.size();
            
            // 处理当前层的所有节点
            for (int i = 0; i < size; i++) {
                Node* node = que.front(); // 取出队首节点
                que.pop(); // 出队
                
                // 将当前节点的子节点(如果有的话)入队
                for (int j = 0; j < node->children.size(); j++) {
                    if (node->children[j])
                        que.push(node->children[j]);
                }
            }
            
            // 当前层的节点处理完毕,深度+1,表示进入下一层
            depth++;
        }
        
        // 返回最大深度
        return depth;
    }
};

算法分析

  • 时间复杂度: 我们需要遍历所有的节点,每个节点都会被访问一次,因此时间复杂度为O(N),其中N是树中节点的总数。
  • 空间复杂度: 在最坏情况下,队列中最多会存储一层的节点,因此空间复杂度为O(W),其中W是树的最大宽度(即同一层节点的最大数量)。在最好情况下,树为平衡树,此时宽度W将接近N/2,因此空间复杂度可以近似看作O(N)。
方法二:递归

算法思路

  1. 首先,我们判断根节点是否为空。如果根节点为空,说明树是空的,深度为0,直接返回0作为结果。
  2. 如果根节点不为空,我们需要对每个子节点进行递归调用。在这个过程中,我们将每个子节点看作根节点,计算其子树的最大深度。
  3. 通过递归调用,我们能够计算出所有子树的最大深度,然后从中选取最大的一个作为当前树的最大深度。
  4. 最终,树的最大深度等于其最深的子树深度加1。

具体实现

class Solution {
public:
    int maxDepth(Node* root) {
        // 如果根节点为空,返回深度为0
        if (root == nullptr) return 0;
        
        // 获取根节点的子节点个数
        int n = root->children.size();
        
        // 初始化最大深度为0
        int max = 0;
        
        // 遍历根节点的所有子节点
        for (int i = 0; i < n; i++) {
            // 递归调用maxDepth函数,计算当前子节点的最大深度
            int Depth = maxDepth(root->children[i]);
            
            // 选取最大的子节点深度作为当前树的最大深度
            if (Depth > max) {
                max = Depth;
            }
        }
        
        // 返回当前树的最大深度加1
        return max + 1;
    }
};

算法分析

  • 时间复杂度: 由于每个节点都会被访问一次且只访问一次,递归调用的次数是节点的总数N,因此时间复杂度为O(N)。
  • 空间复杂度: 递归调用的深度取决于树的高度,而树的高度为最大深度。在最坏情况下,树为单链表形式,高度接近N,因此空间复杂度为O(N)。在最好情况下,树为平衡树,高度为log(N),此时空间复杂度为O(logN)。

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

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

相关文章

互联网医院建设|互联网医疗系统|互联网医院开发功能及特点

互联网医院是一种通过互联网技术与医疗服务相结合的创新模式。它可以让患者在家中或办公室&#xff0c;通过智能终端与医生进行在线咨询、预约挂号、开具电子处方等。这种模式打破了传统医疗的时间与空间限制&#xff0c;为患者提供了更为便捷、高效的医疗服务。 互联网医院功能…

LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

1、问题&#xff1a; https://github.com/CocoaPods/Specs.git/&#xff1a;LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443的解决办法 出现这个问题的原因基本都是代理的问题&#xff1a; 只需要加上代理就可以了&#xff1a; #http代理 git conf…

算法39:Excel 表列序号

一、需求 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1&#xff1a; 输入: columnTitle “A” 输出: 1 示例 2&…

Elasticsearch:通过动态修剪实现更快的基数聚合

作者&#xff1a;Adrien Grand Elasticsearch 8.9 通过支持动态修剪&#xff08;dynamic pruning&#xff09;引入了基数聚合加速。 这种优化需要满足特定的条件才能生效&#xff0c;但一旦实现&#xff0c;通常会产生惊人的结果。 我们观察到&#xff0c;通过此更改&#xff0…

向量vector与sort()

运行代码&#xff1a; //向量与sort() #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;friend istream& operator>>(istream& is, Item& ii);friend ostream& operator<<(ostream& o…

阿里 120W 年薪架构师力荐 750 页微服务架构深度解析笔记

前言 当前&#xff0c;微服务架构在国内正处于蓬勃发展的阶段&#xff0c;无论是大型互联网公司还是传统的 IT 企业&#xff0c;纷纷采用微服务架构构建系统。 在过去几年里&#xff0c;DevOps、云原生、面向演进式架构等理念已经深入人心&#xff0c;围绕微服务生态也出现了…

导致内存泄漏的因素及解决方式

导致内存泄漏的因素 一、全局变量 因为全局变量不被js垃圾回收机制所回收&#xff0c;所以在使用全局变量时要小心。避免在想使用局部变量因为疏忽导致该变量流失到全局&#xff0c;如未声明变量&#xff0c;却直接对其进行赋值&#xff0c;就会导致该变量在全局创建&#xf…

Python Numpy入门基础(一)创建数组

入门基础&#xff08;一&#xff09; 创建数组 1- np.array() 参数众多&#xff0c;初学时只要关注基本用法。 array(...)array(object, dtypeNone, *, copyTrue, orderK, subokFalse, ndmin0,likeNone)Create an array.Parameters----------object : array_likeAn array, …

CAN通信协议

CAN 物理电平 以高速CAN为例 有电压差&#xff08;2.5V&#xff09;为显性&#xff0c;逻辑0无电压差为隐性&#xff0c;逻辑1 帧结构 SOF 恒为显性&#xff0c;逻辑0 仲裁段 当有多个设备发送数据&#xff0c;产生总线冲突时&#xff0c;来判断一个先后顺序由于总线是线与…

重学C++系列之友元

一、什么是友元 在C中&#xff0c;为了提高程序的效率&#xff0c;在一些场景下&#xff0c;引入友元&#xff0c;但同时类的封装性就会被破坏。 二、怎么实现友元 友元关键字&#xff08;friend&#xff09; // 在类中声明另一个类的成员函数来做为友元函数 // 以关键字&…

golangd\pycharm-ai免费代码助手安装使用gpt4-免费使用--[推荐]

golangd-ai免费代码助手安装使用,pycharm可以使用&#xff0c;估计只要是xx的ide都是可以使用这个插件 目前GPT4以及gpt的大规模使用&#xff0c;如何快速掌握以及在ide中快速使用的办法&#xff0c;今天安装一款golangd编辑器的插件已经使用 一、安装以及使用 1.在golangd中…

texshop mac中文版-TeXShop for Mac(Latex编辑预览工具)

texshop for mac是一款可以在苹果电脑MAC OS平台上使用的非常不错的Mac应用软件&#xff0c;texshop for mac是一个非常有用的工具&#xff0c;广泛使用在数学&#xff0c;计算机科学&#xff0c;物理学&#xff0c;经济学等领域的合作&#xff0c;这些程序的标准tetex分布特产…

PKG内容查看工具:Suspicious Package for Mac安装教程

Suspicious Package Mac版是一款Mac平台上的查看 PKG 程序包内信息的应用&#xff0c;Suspicious Package Mac版支持查看全部包内全部文件&#xff0c;比如需要运行的脚本&#xff0c;开发者&#xff0c;来源等等。 suspicious package mac使用简单&#xff0c;只需在选择pkg安…

Druid连接池与Mybatis-Plus非Spring环境整合:报错异常:NoClassDefFoundError

最近在搞一个Netty与扫描枪通信项目;通过调研框架使用Mybatis-PlusDruid作为获取数据库数据,结果整合报了个错,顺便记录下: 一&#xff0c;配置文件: driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://127.0.0.1:3306/xxxxxxx?useUnicodetrue&characterEncodin…

SQL编译优化原理

最近在团队的OLAP引擎上做了一些SQL编译优化的工作&#xff0c;整理到了语雀上&#xff0c;也顺便发在博客上了。SQL编译优化理论并不复杂&#xff0c;只需要掌握一些关系代数的基础就比较好理解&#xff1b;比较困难的在于reorder算法部分。 文章目录 基础概念关系代数等价 j…

面试 | 校招字符串相关高频算法题汇总【C++实现】

文章目录 1、反转字符串2、反转字符串||3、字符串最后一个单词的长度4、找字符串中第一个只出现一次的字符5、仅仅反转字母6、验证一个字符串是否是回文7、反转字符串中的单词【⭐】&#xff08;1&#xff09;移除给出字符串中的多余空格&#xff08;2&#xff09;反转整个字符…

Linux下安装VirtualBox虚拟机

1. 简介 VirtualBox是一款强大的x86和AMD64/Intel64虚拟化产品&#xff0c;适用于企业和家庭。VirtualBox不仅是为企业客户提供的一款功能丰富、高性能的产品&#xff0c;它也是根据GNU通用公共许可证(GPL)版本3条款作为开放源码软件免费提供的唯一专业解决方案。有关VirtualBo…

Modbus TCP使用例程

一、Modbus介绍 关于Modbus的介绍可参考前面的文章<modbus tcp协议介绍及分析>和<modbus rtu通信格式测试解析>这2篇文章。 二、Agile Modbus软件包介绍 Agile Modbus软件包的链接地址&#xff1a; https://gitee.com/RT-Thread-Mirror/agile_modbus Agile Modbus的…

Day46 算法记录| 动态规划 13(子序列)

这里写目录标题 300.最长递增子序列 674. 最长连续递增序列718. 最长重复子数组 300.最长递增子序列 视频解析&#xff1a; 第一层for循环遍历每一个元素&#xff0c; ------- 第二层for循环找到当前元素前面有几个小于该值的元素 结尾需要统计最多的个数 class Solution {pu…

如何有效地使用ChatGPT写小说讲故事?

​构思故事情节&#xff0c;虽有趣但耗时&#xff0c;容易陷入写作瓶颈。ChatGPT可提供灵感&#xff0c;帮你解决写作难题。要写出引人入胜的故事&#xff0c;关键在于抓住八个要素——主题、人物、视角、背景、情节、语气、冲突和解决办法。 直接给出故事模板&#xff0c;你可…