LeetCode104. 二叉树的最大深度

104. 二叉树的最大深度

文章目录

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


一、题目

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7]

    3/ \9  20/  \15   7

返回它的最大深度 3 。

二、题解

方法一:递归

算法思路:

我们要求一棵二叉树的最大深度,即从根节点到最远叶子节点的最长路径上的节点数。我们可以利用递归的思想来解决这个问题。从根节点开始,我们分别计算左子树和右子树的最大深度,然后取两者的较大值,并将其加上1,即为当前节点所在子树的最大深度。

我们可以把问题拆解为几个子问题:

  1. 如果当前节点为空(即为叶子节点的下一层),那么深度为0。
  2. 否则,我们需要递归地求解左子树和右子树的最大深度。
  3. 然后取左右子树深度的较大值,再加上1,就得到当前节点所在子树的最大深度。

具体实现:

在具体实现上,我们可以按照上述思路编写代码。首先,我们要定义好二叉树的节点结构,这里题目已经给出了定义。接下来,我们创建一个递归函数 maxDepth 来计算二叉树的最大深度。

cppCopy code/*** 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 maxDepth(TreeNode* root) {// 基本情况:如果当前节点为空,则深度为0if (root == nullptr) return 0;// 递归地计算左子树的深度int leftDepth = maxDepth(root->left);// 递归地计算右子树的深度int rightDepth = maxDepth(root->right);//返回左右子树的最大深度加1return max(leftDepth, rightDepth) + 1;}
};

算法分析:

现在我们来分析一下这个算法的复杂度。

  1. 时间复杂度:每个节点都会被访问一次,所以时间复杂度为O(N),其中N是二叉树的节点数。
  2. 空间复杂度:递归函数调用会占用一定的栈空间,而在递归深度方面,最坏情况下(二叉树为单链),递归深度为树的高度,所以空间复杂度为O(H),其中H为二叉树的高度。在最好情况下(完全平衡二叉树),树的高度为log(N),在最坏情况下(非平衡二叉树),树的高度为N,因此空间复杂度在O(logN)到O(N)之间。
方法二:迭代

算法思路:

我们也可以利用广度优先搜索(BFS)来解决。广度优先搜索是一种逐层遍历的方法,我们可以在遍历的过程中记录树的深度。我们从根节点开始,将其入队,然后在队列不为空的情况下进行循环操作,每次循环遍历当前队列中的所有节点,将它们的子节点入队。每完成一轮循环,即遍历完当前层的所有节点,我们增加深度计数器,并继续下一轮循环。直到队列中的所有节点都被处理完毕,整个过程结束,此时深度计数器的值就是二叉树的最大深度。

具体实现:

为了实现上述算法思路,我们首先定义二叉树的节点结构 TreeNode。然后,我们使用一个队列 que 来辅助我们进行广度优先搜索。我们将根节点入队,然后通过循环遍历队列中的节点,将它们的子节点入队,并不断更新深度计数器 depth。最后,当队列为空时,我们返回 depth 即为二叉树的最大深度。

cppCopy code/*** 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 maxDepth(TreeNode* root) {if (root == nullptr) return 0; // 空树深度为0int depth = 0; // 初始化深度为0queue<TreeNode*> que; // 创建一个队列用于BFSque.push(root); // 将根节点入队while (!que.empty()) { // 进行BFSint size = que.size(); // 当前层的节点数while (size--) { // 遍历当前层的所有节点TreeNode* node = que.front();que.pop();if (node->left) que.push(node->left); // 将左子节点入队if (node->right) que.push(node->right); // 将右子节点入队}depth++; // 记录深度,每层遍历结束后加1}return depth; // 返回最大深度}
};

算法分析:

在分析这个算法的复杂度时,我们可以得出以下结论:

  1. 时间复杂度:对于一颗有N个节点的二叉树,每个节点都会被访问一次,因为每个节点都会入队一次,并且最多出队一次。因此,时间复杂度为O(N)。
  2. 空间复杂度:在最坏情况下(完全二叉树),队列中最多会包含一层的节点数,即为N/2个节点,因此空间复杂度为O(N/2),近似于O(N)。

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

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

相关文章

机器学习深度学习——线性回归的基本元素

回归用来表示输入输出之间的关系。 用实际例子来解释一下线性回归&#xff1a;根据房屋的面积、房龄来估算房屋价格。为了实现这个预测放假的模型&#xff0c;需要收集一个真实的数据集&#xff0c;该数据集包括了房屋的销售价格、面积和房龄。 在机器学习中&#xff0c;这个数…

lambda匿名函数

问题:什么是lambda函数?它有什么好处?举例说明 解答 含义 在Python中,不通过def来声明函数名字,而是通过lambda关键字来定义的函数称为匿名函数,即函数没有具体的名称,你可以理解为一句话写一个函数 Lambda表达式是Python中一类特殊的定义函数的形式,从语义上讲,它…

(学习笔记-IP)Ping的工作原理

Ping是基于ICMP协议工作的&#xff0c;ICMP报文封装在IP包里面&#xff0c;它工作在网络层&#xff0c;是IP协议的助手。 ICMP包头的类型字段&#xff0c;大致可分为两大类&#xff1a; 一类是用于诊断的查询消息&#xff0c;也就是查询报文类型一类是通知出错原因的错误消息&…

Shell编程基础(三)环境变量 位置变量 系统内置变量

环境变量 & 环境变量环境变量范围父子进程之间有效指定用户有效所有用户有效 位置变量系统内置变量 环境变量 在脚本种直接定义的变量&#xff0c;只能在当前shell进程中使用 若想要在其他shell进程中使用&#xff0c;可以将变量声明为 环境变量 export 变量名 &#xff…

Spring 的元注解

一、元注解介绍 1.1.源码引入 1.2.元注解介绍 从上面的图片可知&#xff0c;Spring 有四个【负责注解其他注解】的元注解&#xff0c;分别是&#xff1a; Target&#xff1a;标识该注解可以用于标注哪些程序元素&#xff0c;比如类、方法、字段等。 Retention&#xff1a;标…

Zabbix-server监控mysql及httpd服务

目录 一、Zabbix监控mysql数据库 1、为server.Zabbix.com添加服务模板 2、创建mysql服务图形 二、server.zabbix.com服务器操作 编辑chk_mysql.sh脚本 三、server.Zabbix.com测试 四、查看web效果 五、Zabbix监控apache&#xff08;httpd服务&#xff09; 安装master 六、…

C++ 提高编程

C 提高编程 主要针对C泛型编程和STL技术 一、 模板 1、 概念 模板就是建立通用的模具&#xff0c;大大提高代码的复用性 模板特点 模板不可以直接使用&#xff0c;它只是一个框架 ​ 模板的通用并不是万能的 2、 函数模板 C 另一种编程思想为泛型编程&#xff0c;主要利用的…

Ubuntu搭建Samba服务-学习记录

文章目录 Ubuntu安装Samba流程Samba配置文件Samba添加账户配置文件修改Samba服务控制设置开机自动启动通过systemctl 启动服务通过 rc.local 启动 Windows访问参考链接 当前文章仅用于记录&#xff0c;在 Ubuntu中安装使用Samba&#xff0c;在Windows访问 系统环境&#xff1a;…

NestJS 的 Module 学习

Module 概念 模块使用Module()装饰器来装饰的类。装饰器Module()提供 NestJS 用于组织应用程序结构相关的数据&#xff0c;例如提供商和控制器等等。具体的结构图如下&#xff1a; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T3CAmLIm-16902949…

【JS 同步调用多个函数 Promise.all】

在 JS 异步编程中&#xff0c;可以使用 Promise.all 方法来实现同步调用多个函数。 Promise.all 方法接收一个包含各个 Promise 对象的数组作为参数&#xff0c;返回一个新的 Promise 对象。当数组中所有的 Promise 对象都成功&#xff08;即状态为 resolved&#xff09;时&am…

【问题记录】Ubuntu 22.04 环境下,程序报:段错误(核心已转储)怎么使用 core 文件和GDB调试器 解决?

目录 环境 问题情况 解决思路 原因分析 解决方法 番外知识 环境 VMware Workstation 16 Pro &#xff08;版本&#xff1a;16.1.2 build-17966106&#xff09;ubuntu-22.04.2-desktop-amd64 问题情况 本人在运行百万并发的服务端程序时&#xff0c;程序运行报&#xff1a…

JVM运行时数据区——方法区的垃圾回收

方法区的垃圾回收主要是两部分&#xff1a;运行时常量池中废弃的常量和不在使用的类。 类卸载(将不在使用的类回收)的条件&#xff1a; 该类的所有实例均被回收。 加载该类的类加载器被回收(一般很难满足)。 类对象不再引用&#xff0c;通过反射也获取不到。

alias取别名后,另一个shell中和shell脚本中不生效的问题以及crontab执行docker失败问题

目录 问题一&#xff1a;用alias取别名后&#xff0c;另一个shell中不生效描述原因解决 问题二&#xff1a;用alias取别名后&#xff0c;别名在脚本中不生效描述原因解决 问题三&#xff1a;crontab计划任务不能运行docker命令描述原因解决 问题一&#xff1a;用alias取别名后&…

VLAN---虚拟局域网

VLAN— 虚拟局域网 LAN—局域网 MAN—城域网 WAN—广域网 1.一个VLAN相当于是一个广播域 VLAN—通过路由器和交换机协同工作后&#xff0c;将原本的一个广播域逻辑上&#xff0c;拆 分为多个虚拟的广播域。 VLAN配置&#xff1a; 1.创建VLAN VID—VLAN ID------用来区分和…

浅谈能源管理系统在水泥行业中设计分析

安科瑞 华楠 摘要&#xff1a;水泥企业作为我国产业结构中重要的耗能产业&#xff0c;同时对环境的污染也比较大&#xff0c;因此在水泥企业中建立能源管理系统&#xff0c;对水泥企业的生产过程过程进行全过程的监控和管理&#xff0c;对于降低企业的能源消耗和提高企业的经济…

【Ajax】笔记-Axios与函数发送AJAX请求

Axios 和 Ajax 的区别 1、Axios是一个基于Promise的HTTP库&#xff0c;而Ajax是对原生XHR的封装&#xff1b; 2、Ajax技术实现了局部数据的刷新&#xff0c;而Axios实现了对ajax的封装。 优缺点&#xff1a; ajax&#xff1a; 本身是针对MVC的编程,不符合现在前端MVVM的浪潮 基…

Rust中的Iterator和IntoIterator介绍及应用

Iterator即迭代器&#xff0c;它可以用于对数据结构进行迭代。被迭代的数据结构是可迭代的(iterable)&#xff0c;所谓的可迭代就是这个数据结构有返回迭代器的方法&#xff0c;由于Rust的所有权机制&#xff0c;对一个数据结构的迭代器&#xff0c;有三种&#xff1a; 拿走数…

【MySQL】之复合查询

【MySQL】之复合查询 基本查询多表查询笛卡尔积自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询 合并查询小练习 基本查询 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J按照部门号升序而雇员的工资降序排序使用…

性能测试Ⅱ(压力测试与负载测试详解)

协议 性能理论&#xff1a;并发编程 &#xff0c;系统调度&#xff0c;调度算法 监控 压力测试与负载测试的区别是什么&#xff1f; 负载测试 在被测系统上持续不断的增加压力&#xff0c;直到性能指标(响应时间等)超过预定指标或者某种资源(CPU&内存)使用已达到饱和状…

全志F1C200S嵌入式驱动开发(解决spi加载过慢的问题)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 之前的几个章节当中,我们陆续解决了spi-nor驱动的问题、uboot支持spi-nor的问题。按道理来说,下面要做的应该就是用uboot的loady命令把kernel、dtb、rootfs这些文件下载到ddr,然…