LeetCode559. N 叉树的最大深度

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】Multiple Variable Linear Regression

Multiple Variable Linear Regression 1、问题描述1.1 包含样例的X矩阵1.2 参数向量 w, b 2、多变量的模型预测2.1 逐元素进行预测2.2 向量点积进行预测 3、多变量线性回归模型计算损失4、多变量线性回归模型梯度下降4.1 计算梯度4.2梯度下降 首先&#xff0c;导入所需的库 im…

架构的分类

目录 一、 RUP41 架构 1.1 RUP41架构方法概述 1.2 RUP41架构总体 1.3 RUP41架构方法内容 1.3.1 逻辑视图 1.3.2 开发视图 1.3.3 物理视图 1.3.4 处理视图 1.3.5 场景视图 ​二、 TOGAF9 架构 2.1 TOGAF9 架构概述 2.2 TOGAF9 架构分类 2.2.1 业务架构 2.2.2 数据架…

蓝海卓越计费管理系统远程命令执行

活着&#xff0c;就要时刻准备承受磨难&#xff01; 漏洞描述 蓝海卓越计费管理系统存在命令调试页面&#xff0c;导致攻击者可以远程命令执行 漏洞复现 访问 debug.php页面 远程调试命令执行 /debug.php漏洞证明 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝…

linux -网络编程-多线程并发服务器

目录 1.三次握手和四次挥手 2 滑动窗口 3 函数封装思想 4 高并发服务器 学习目标&#xff1a; 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器 1.三次握手和四次挥手 思考: 为什么…

手把手教你使用stable diffusion生成自己的艺术二维码

艺术二维码制作指南 导读midjourneystable diffusion 环境准备安装stable diffusion webuisd-webui-qrcode-toolkit安装 草料二维码模型准备QR PatternQR Code MonsterIoC Lab Control Net 艺术二维码制作1. 二维码信息提取2. 使用QR Tookit生成二维码3. 下载二维码图片4. prom…

Modbus tcp转ETHERCAT网关modbus tcp/ip协议

捷米JM-ECT-TCP网关能够连接到Modbus tcp总线和ETHERCAT总线中&#xff0c;实现两种不同协议设备之间的通讯。这个网关能够大大提高工业生产的效率和生产效益&#xff0c;让生产变得更加智能化。捷米JM-ECT-TCP 是自主研发的一款 ETHERCAT 从站功能的通讯网关。该产品主要功能是…

一个监控系统的典型架构

监控系统的典型架构图&#xff0c;从左往右看&#xff0c;采集器是负责采集监控数据的&#xff0c;采集到数据之后传输给服务端&#xff0c;通常是直接写入时序库。然后就是对时序库的数据进行分析和可视化&#xff0c;分析部分最典型的就是告警规则判断&#xff0c;即图上的告…

【mysql学习篇】Order by与Group by优化以及排序算法详解

一、Order by与Group by优化 Case1&#xff1a; 分析&#xff1a; 利用最左前缀法则&#xff1a;中间字段不能断&#xff0c;因此查询用到了name索引&#xff0c;从key_len74也能看出&#xff0c;age索引列用在排序过程中&#xff0c;因为Extra字段里没有using filesort 注意…

擎创技术流 | 深入浅出运维可观测工具(二):eBPF应用中常见问题

上期跟大家聊了下eBPF的发展历史还有特性&#xff0c;点击这里↓↓↓擎创技术流 | 深入浅出运维可观测工具&#xff08;一&#xff09;&#xff1a;聊聊eBPF的前世今生&#xff0c;一键回看上期精彩内容。 这期主要跟大家分享下eBPF在应用过程中可能出现的问题&#xff0c;希望…

本地仓库推送至远程仓库

1. 本地生成ssh密钥对 ssh-keygen -t rsa -C 邮箱2. 添加公钥到gitlab/github/gitee上 打开C:\Users\用户名\.ssh目录下生成的密钥文件id_rsa.pub&#xff0c;把内容复制到如下文本框中 删除Expiration date显示的日期&#xff0c;公钥有效期变成永久&#xff0c;之后点Add K…

vmware中windows操作系统虚拟机安装

1.win10中安装 1.1 虚拟机向导 文件-新建虚拟机 典型-下一步 稍后安装操作系统-下一步 window10 64x -下一步 修改虚拟机名称及位置-下一步 默认60g,至少大于40g-将虚拟磁盘拆分成多个文件夹-下一步 点击完成 1.2 编辑虚拟机设置 移除打印机 设置虚拟机&#xff0c;加入iso映…

联想北京公司研发管理部高级经理周燕龙受邀为第十二届中国PMO大会演讲嘉宾

联想&#xff08;北京&#xff09;有限公司研发管理部高级经理周燕龙先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;PMO如何助力研发。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; PMO在…

js中的遍历方法比较:map、for...in、for...of、reduce和forEach的特点与适用场景

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;JavaScript中的遍历方法比较&#xff1a;map、for…in、for…of和forEach的特点与适用场景 文章目录 map 方法概述用法返回值特点 for...in 循环概述用法注意事项 for...of 循环概述用法可迭代对象…

用LangChain开源框架实现知识机器人

前言 Large Language Models (LLMs)在2020年OpenAI 的 GPT-3 的发布而进入世界舞台 。从那时起&#xff0c;他们稳步增长进入公众视野。 众所周知 OpenAI 的 API 无法联网&#xff0c;所以大家如果想通过它的API实现联网搜索并给出回答、总结 PDF 文档、基于某个 Youtube 视频…

[nlp] TF-IDF算法介绍

&#xff08;1&#xff09;TF是词频(Term Frequency) 词频是文档中词出现的概率。 &#xff08;2&#xff09; IDF是逆向文件频率(Inverse Document Frequency) 词条出现率越低&#xff0c;IDF越大。

Dooring-Saas低代码技术详解

hello, 大家好, 我是徐小夕, 今天和大家分享一下基于 H5-Dooring零代码 开发的全新零代码搭建平台 Dooring-Saas 的技术架构和设计实现思路. 背景介绍 3年前我上线了第一版自研零代码引擎 H5-Dooring, 至今已迭代了 300 多个版本, 主要目的是快速且批量化的生产业务/营销过程中…

红黑树解密:为什么根节点必须是黑色,两个红色节点不能挨着?

红黑树解密&#xff1a;为什么根节点必须是黑色&#xff0c;两个红色节点不能挨着&#xff1f; 博主简介一、引言1.1、红黑树是什么及其特点1.2、根节点为黑色和红色节点不连续的性质介绍 二、为何根节点必须是黑色&#xff1f;三、为何两个红色节点不能挨着&#xff1f;总结 博…

RNN架构解析——LSTM模型

目录 LSTMLSTM内部结构图 Bi-LSTM实现 优点和缺点 LSTM LSTM内部结构图 Bi-LSTM 实现 优点和缺点

Windows系统如何修改文件日期属性

winr键&#xff0c;输入powershell,在弹出的命令窗口输入命令&#xff0c;案例如下&#xff1a; file_address E:\_OrderingProject\\PIC1101\ldv1s_0830_ec_result.tiftime_change "07/12/2022 20:42:23" 修改文件创建时间&#xff1a;creationtime $(Get-Item fi…

STL 关于vector的细节,vector模拟实现【C++】

文章目录 vector成员变量默认成员函数构造函数拷贝构造赋值运算符重载函数析构函数 迭代器beginend size和capacityresizereserve[ ]push_backpop_backinserteraseswap vector成员变量 _start指向容器的头&#xff0c;_finish指向容器当中有效数据的下一个位置&#xff0c;_end…