二叉树的最大深度
创始人
2025-05-31 08:21:38

1题目

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

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

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

示例:

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

3

/ \

9 20

/ \

15 7

返回它的最大深度 3 。

2链接

题目:104. 二叉树的最大深度 - 力扣(Leetcode)

视频:二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | LeetCode:104.二叉树的最大深度_哔哩哔哩_bilibili

3解题思路

3.1递归法

本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)

  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)

而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。

先用后序遍历(左右中)来计算树的高度。

  1. 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。

代码如下:

intgetdepth(treenode* node)
  1. 确定终止条件:如果为空节点的话,就返回0,表示高度为0。

代码如下:

if(node ==NULL)return0;
  1. 确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。

代码如下:

int leftdepth = getdepth(node->left);       // 左
int rightdepth = getdepth(node->right);     // 右
int depth = 1 + max(leftdepth, rightdepth); // 中
return depth;

后序遍历解释:

该代码通过递归方式计算每个节点的深度,再求出所有节点深度的最大值,从而得到二叉树的最大深度。具体实现可以分为两个方法:

getDepth 方法用于计算单个节点的深度,采用了递归方式:

首先进行特判,如果当前节点为空(即已经递归到了叶子节点的子节点),则返回 0。

然后分别递归求解左右子树的深度,并记录在 leftDepth 和 rightDepth 变量中。

最后将左右子树深度的最大值加 1,即为当前节点的深度,记录在 Depth 变量中,并返回。

maxDepth 方法用于计算整棵二叉树的最大深度,直接调用 getDepth 方法即可。

总体来说,该算法时间复杂度为 O(N),其中 N 是二叉树的节点数。因为需要遍历每个节点,所以时间复杂度至少为线性级别。

前序遍历也可以,代码会在最后体现,解释:

该代码同样采用了递归方式计算二叉树的最大深度,不同之处在于:

getDepth 函数中计算当前节点到根节点的深度,并与 result 变量比较,选择较大值更新 result。

对于非叶子节点,如果存在左子树,则递归调用 getDepth 函数访问左子树,并将深度加 1;如果存在右子树,则同理访问右子树。

总体来说,该算法时间复杂度为 �(�)O(N),其中 �N 是二叉树的节点数。因为需要遍历每个节点,所以时间复杂度至少为线性级别。

3.2迭代法

使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。

在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示:

所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。

迭代法解释:

该代码采用了迭代法-层序遍历的方式来计算二叉树的最大深度。具体步骤如下:

  1. 首先判断根节点是否为空,若为空则直接返回0。

  1. 创建一个队列 que,并将根节点入队。

  1. 初始化深度变量 depth 为 0,表示从根节点开始。

  1. 开始循环,每次访问一层的节点。在每次循环中:

a. 深度变量 depth 加 1,记录下当前所在层数。

b. 获取当前层的节点数 level_size,即当前队列的元素个数。

c. 遍历当前层的所有节点,依次取出队首元素,将其左右子节点入队。

  1. 如果队列为空,说明已经遍历完了整棵树,返回最大深度 depth。

整个算法的时间复杂度是O(N),其中 N 是二叉树的节点个数。因为需要遍历每个节点一次,所以时间复杂度至少为线性级别。而空间复杂度则取决于队列的大小,最坏情况下所有节点都在同一层,队列的大小就是 O(N)。

综上所述,该算法的时间复杂度和空间复杂度都比较优秀,且实现简单易懂。

4代码

/*** 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 getDepth(TreeNode* node) {if (node == nullptr) return 0; // 特判:如果当前节点为空,则返回0int leftDepth = getDepth(node -> left); // 递归求解左子树的深度int rightDepth = getDepth(node -> right); // 递归求解右子树的深度int Depth = 1 + max(leftDepth, rightDepth); // 计算当前节点的深度,即左右子树深度的最大值加1return Depth; // 返回当前节点的深度}// 用于计算二叉树的最大深度int maxDepth(TreeNode* root) {return getDepth(root); // 直接调用 getDepth 函数,返回二叉树的最大深度}
};//递归法-前序遍历
class Solution {
public:int result; // 定义变量 result,用于记录二叉树的最大深度// 用于递归计算每个节点的深度void getDepth(TreeNode* node, int depth) {result = depth > result ? depth : result; // 计算当前节点到根节点的深度,并更新 result 值if (node->left == nullptr && node->right == nullptr) return ; // 如果当前节点为叶子节点,则返回if (node->left) { // 如果存在左子树getDepth(node->left, depth + 1); // 继续访问左子树,深度加1}if (node->right) { // 如果存在右子树getDepth(node->right, depth + 1); // 继续访问右子树,深度加1}return ;}// 用于计算二叉树的最大深度int maxDepth(TreeNode* root) {result = 0; // 将 result 变量初始化为 0if (root == nullptr) return result; // 如果二叉树为空,则直接返回 0getDepth(root, 1); // 递归计算二叉树的最大深度return result; // 返回二叉树的最大深度}
};//迭代法-层序遍历
class Solution {
public:int maxDepth(TreeNode* root) { // 输入根节点指针,返回最大深度if (root == nullptr) return 0; // 特判:如果根节点为空,则返回0queue que; // 创建一个队列,储存每层的节点que.push(root); // 将根节点入队int depth = 0; // 初始化深度为0while (!que.empty()) { // 当队列不为空时,进行循环操作depth++; // 记录深度加1int level_size = que.size(); // 获取当前层的节点数for (int i = 0; i < level_size; i++) { // 遍历当前层的所有节点TreeNode* node = que.front(); // 取出队首节点que.pop(); // 队首节点出队if (node->left) que.push(node->left); // 如果有左子节点,加入队列if (node->right) que.push(node->right); // 如果有右子节点,加入队列}}return depth; // 返回最大深度}
};

相关内容

热门资讯

特朗普,突发!中概股大涨!美股... 特朗普,再度发声催促美联储主席鲍威尔降息。 中概股爆发 6月4日晚间,美股集体高开,道琼斯、纳斯达克...
创业板IPO失败五月后,六合宁... 导读:前次创业板IPO的告败,除了监管层对生物医药企业的资本化审慎以待外,六合宁远自身业绩的“隐患”...
百奥泰董事长李胜峰:聚焦研发创... 本报记者 丁蓉 见习记者 张美娜 在全球医疗科技竞争格局深度重构的背景下,中国生物制药产业正以创新突...
香港一银行发生抢劫案:劫匪疑欠... 【环球网报道】据香港文汇网4日报道,香港沙田置富第一城商场恒生银行分行2日下午被人劫走逾38万港元,...
便利店冰柜,来了一个“C位杀手... 本文来自微信公众号:DT商业观察,作者:孟萍萍,编辑:张晨阳,设计:戚桐珲,运营:苏洪锐,题图来自:...
深夜,利好!全线爆发! 超级赛道再迎利好催化。 今晚,美股核能概念股全线爆发,Nuscale Power盘初一度大涨超13%...
中证光大阳光指数报5306.2... 金融界6月4日消息,上证指数高开高走,中证光大阳光指数 (光大阳光,H00999)报5306.29点...
营销新风向:生活和情感,成为新... 成为消费者的 " 精神代餐 " 乃至 Life partner 毫无疑问,营销在快消行业是适用的。 ...
港股IPO火热 A股巨头密集赴... 今年以来,港股IPO市场持续火热,年内已有28家新股登陆港股市场,募资总额达773.20亿港元,已接...
哪些人最易被AI淘汰 哪些人最... 本文来自微信公众号:沈素明,作者:沈素明,原文标题:《这8类人最易被Ai淘汰,其中有你吗?》办公室没...
专题 | 科技赋能航运金融数字... 在全球经济一体化的背景下,航运业成为连接世界各地的重要纽带、国际贸易的重要支柱,对于经济增长至关重要...
风评 | 端午小长假,火了“青... 今年端午节,在青岛出现的啤酒“青交所”,走红全网。 端午假期与儿童节的奇妙邂逅,让位于青岛台东步行街...
是他!招商证券新总裁官宣! 6月3日晚间,招商证券公告称,经董事会全票表决通过,聘任原招商银行副行长朱江涛担任总裁,任期至第八届...
公募行业掀起自购潮,浮动费率基... 6月3日,兴证全球基金发布公告称,拟以2000万元自有资金认购旗下新发浮动费率基金“兴证全球合熙混合...
特朗普急了:现在必须降息! 当地时间6月4日,由于“小非农”ADP就业数据和ISM服务业数据双双表现欠佳,美股市场承压,美元指数...
“Labubu经济学”爆了!港... 最近,一些始于中国的消费新趋势开始席卷全球。欧美天后蕾哈娜晒出泡泡玛特的Labubu挂件,球星贝克汉...
新手开餐饮店是赚还是赔?算清楚... 本文来自微信公众号:红餐网,作者:陈小将,头图来自:AI生成餐饮业依然是热门的创业赛道。企查查数据显...
蔚来“全员算账”能否再次逆天改... 2025.06.04本文字数:3754,阅读时长大约6分钟作者 |第一财经 葛慧自2019年后,今年...
韩国通胀率五个月来首次低于2%... 韩国央行周三表示,预计今年通胀率将保持稳定,但由于美国激进关税计划带来的不确定性,外汇波动和全球油价...
蔚来李斌:不喜欢“价格战” 备受关注的中国造车新势力蔚来今天在上海召开沟通会。针对近日种种传闻,蔚来董事长李斌介绍了对行业“价格...
61岁李在明执掌韩国,中韩关系... 本文来源:时代周报 作者:马欢韩国总统李在明4日正式开启总统任期。据人民网报道,李在明于4日上午在国...
泰林生物:控股股东叶大林协议转... 新京报贝壳财经讯 6月4日,泰林生物公告,控股股东、实际控制人叶大林先生拟将其持有的1210万股(占...
这5种「养老金」,90%的人只... 点击 “简七读财” ,发送消息“ 理财小工具 ”免费领取“40个赚钱工具资源包”上周母亲节,家里的...
晚间公告丨今日这些公告有看头 ... 今日晚间,沪深两市多家上市公司发布公告,以下是第一财经对一些重要公告的汇总,供投资者参考。【品大事】...
黄金手办,能否持续“收割”年轻... 文 | 道总有理 五月份,老凤祥与《圣斗士星矢》推出联名产品,上市短短两周,系列产品已创下近亿元销售...
算力硬件股集体走强,云计算ET... 今日算力产业链集体走强,CPO、铜缆高速连接方向涨幅居前。指数方面,中证云计算与大数据主题指数上涨1...
成都太古里“美女总裁”获晋升,... 近日,有消息称,太古地产(HK01972)宣布一系列重要人事调整。变动涉及上海、北京、成都三地太古里...
原创 陕... 雷达财经出品 文|莫恩盟 编|深海 “汝求战,便得战!”不久前闹得沸沸扬扬的医美“大战”,又掀新剧情...
紫金矿业多“金”不易 拟分拆黄... 一边是老牌黄金矿业巨头山东黄金(600547.SH)年内超九成的股价涨幅,一边是上市11个月市值翻了...