0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

二叉树的最大深度

算法与数据结构 来源:代码随想录 作者:代码随想录 2022-07-26 11:28 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

尽管之前你可能做过这道题目,但只要认真看完,相信你会收获满满!可以一起解决如下两道题目:

  • 104.二叉树的最大深度
  • 559.n叉树的最大深度

104.二叉树的最大深度

题目地址:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/

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

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

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

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

7b9b835a-0c92-11ed-ba43-dac502259ad0.png

返回它的最大深度 3 。

递归法

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

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

这一点其实是很多同学没有想清楚的,很多题解同样没有讲清楚。

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

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

代码如下:

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

代码如下:

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

代码如下:

intleftdepth=getdepth(node->left);//左
intrightdepth=getdepth(node->right);//右
intdepth=1+max(leftdepth,rightdepth);//中
returndepth;

所以整体c++代码如下:

classsolution{
public:
intgetdepth(treenode*node){
if(node==null)return0;
intleftdepth=getdepth(node->left);//左
intrightdepth=getdepth(node->right);//右
intdepth=1+max(leftdepth,rightdepth);//中
returndepth;
}
intmaxdepth(treenode*root){
returngetdepth(root);
}
};

代码精简之后c++代码如下:

classsolution{
public:
intmaxdepth(treenode*root){
if(root==null)return0;
return1+max(maxdepth(root->left),maxdepth(root->right));
}
};

精简之后的代码根本看不出是哪种遍历方式,也看不出递归三部曲的步骤,所以如果对二叉树的操作还不熟练,尽量不要直接照着精简代码来学。

本题当然也可以使用前序,代码如下:(充分表现出求深度回溯的过程)

classsolution{
public:
intresult;
voidgetdepth(treenode*node,intdepth){
result=depth>result?depth:result;//中

if(node->left==null&&node->right==null)return;

if(node->left){//左
depth++;//深度+1
getdepth(node->left,depth);
depth--;//回溯,深度-1
}
if(node->right){//右
depth++;//深度+1
getdepth(node->right,depth);
depth--;//回溯,深度-1
}
return;
}
intmaxdepth(treenode*root){
result=0;
if(root==0)returnresult;
getdepth(root,1);
returnresult;
}
};

可以看出使用了前序(中左右)的遍历顺序,这才是真正求深度的逻辑!

注意以上代码是为了把细节体现出来,简化一下代码如下:

classsolution{
public:
intresult;
voidgetdepth(treenode*node,intdepth){
result=depth>result?depth:result;//中
if(node->left==null&&node->right==null)return;
if(node->left){//左
getdepth(node->left,depth+1);
}
if(node->right){//右
getdepth(node->right,depth+1);
}
return;
}
intmaxdepth(treenode*root){
result=0;
if(root==0)returnresult;
getdepth(root,1);
returnresult;
}
};

迭代法

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

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

7bb59e02-0c92-11ed-ba43-dac502259ad0.png

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

如果对层序遍历还不清楚的话,可以看这篇:二叉树:层序遍历登场!

c++代码如下:

classsolution{
public:
intmaxdepth(treenode*root){
if(root==null)return0;
intdepth=0;
queueque;
que.push(root);
while(!que.empty()){
intsize=que.size();
depth++;//记录深度
for(inti=0;i< size; i++) {
                treenode* node = que.front();
                que.pop();
                if(node->left)que.push(node->left);
if(node->right)que.push(node->right);
}
}
returndepth;
}
};

那么我们可以顺便解决一下n叉树的最大深度问题

559.n叉树的最大深度

题目地址:https://leetcode-cn.com/problems/maximum-depth-of-n-ary-tree/

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

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

例如,给定一个 3叉树 :

7bc4f44c-0c92-11ed-ba43-dac502259ad0.png

我们应返回其最大深度,3。

思路:

依然可以提供递归法和迭代法,来解决这个问题,思路是和二叉树思路一样的,直接给出代码如下:

递归法

c++代码:

classsolution{
public:
intmaxdepth(node*root){
if(root==0)return0;
intdepth=0;
for(inti=0;i< root->children.size();i++){
depth=max(depth,maxdepth(root->children[i]));
}
returndepth+1;
}
};

迭代法

依然是层序遍历,代码如下:

classsolution{
public:
intmaxdepth(node*root){
queueque;
if(root!=null)que.push(root);
intdepth=0;
while(!que.empty()){
intsize=que.size();
depth++;//记录深度
for(inti=0;i< size; i++) {
                node* node = que.front();
                que.pop();
                for(intj=0;j< node->children.size();j++){
if(node->children[j])que.push(node->children[j]);
}
}
}
returndepth;
}
};

其他语言版本

java

104.二叉树的最大深度

classsolution{
/**
*递归法
*/
publicintmaxdepth(treenoderoot){
if(root==null){
return0;
}
intleftdepth=maxdepth(root.left);
intrightdepth=maxdepth(root.right);
returnmath.max(leftdepth,rightdepth)+1;

}
}
classsolution{
/**
*迭代法,使用层序遍历
*/
publicintmaxdepth(treenoderoot){
if(root==null){
return0;
}
dequedeque=newlinkedlist<>();
deque.offer(root);
intdepth=0;
while(!deque.isempty()){
intsize=deque.size();
depth++;
for(inti=0;i< size; i++) {
                treenode poll = deque.poll();
                if(poll.left!=null){
deque.offer(poll.left);
}
if(poll.right!=null){
deque.offer(poll.right);
}
}
}
returndepth;
}
}

python

104.二叉树的最大深度

递归法:

classsolution:
defmaxdepth(self,root:treenode)->int:
returnself.getdepth(root)

defgetdepth(self,node):
ifnotnode:
return0
leftdepth=self.getdepth(node.left)#左
rightdepth=self.getdepth(node.right)#右
depth=1+max(leftdepth,rightdepth)#中
returndepth

递归法:精简代码

classsolution:
defmaxdepth(self,root:treenode)->int:
ifnotroot:
return0
return1+max(self.maxdepth(root.left),self.maxdepth(root.right))

迭代法:

importcollections
classsolution:
defmaxdepth(self,root:treenode)->int:
ifnotroot:
return0
depth=0#记录深度
queue=collections.deque()
queue.append(root)
whilequeue:
size=len(queue)
depth+=1
foriinrange(size):
node=queue.popleft()
ifnode.left:
queue.append(node.left)
ifnode.right:
queue.append(node.right)
returndepth

559.n叉树的最大深度

递归法:

classsolution:
defmaxdepth(self,root:'node')->int:
ifnotroot:
return0
depth=0
foriinrange(len(root.children)):
depth=max(depth,self.maxdepth(root.children[i]))
returndepth+1

迭代法:

importcollections
classsolution:
defmaxdepth(self,root:'node')->int:
queue=collections.deque()
ifroot:
queue.append(root)
depth=0#记录深度
whilequeue:
size=len(queue)
depth+=1
foriinrange(size):
node=queue.popleft()
forjinrange(len(node.children)):
ifnode.children[j]:
queue.append(node.children[j])
returndepth

使用栈来模拟后序遍历依然可以

classsolution:
defmaxdepth(self,root:'node')->int:
st=[]
ifroot:
st.append(root)
depth=0
result=0
whilest:
node=st.pop()
ifnode!=none:
st.append(node)#中
st.append(none)
depth+=1
foriinrange(len(node.children)):#处理孩子
ifnode.children[i]:
st.append(node.children[i])

else:
node=st.pop()
depth-=1
result=max(result,depth)
returnresult

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    22

    文章

    2129

    浏览量

    77360
  • 代码
    +关注

    关注

    30

    文章

    4976

    浏览量

    74369
  • 二叉树
    +关注

    关注

    0

    文章

    74

    浏览量

    12997

原文标题:看看这些树的最大深度!

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    科技,IPO申请获受理

    电子发烧友网综合报道 3月20日,上交所网站显示,宇科技股份有限公司科创板IPO申请已受理,成为又一家科创板IPO“预先审阅”落地项目。此次IPO,宇科技拟募资42.02亿元。   招股书显示
    的头像 发表于 03-20 18:33 4204次阅读
    宇<b class='flag-5'>树</b>科技,IPO申请获受理

    光伏应用利器:SM74611智能旁路极管深度解析

    光伏应用利器:SM74611智能旁路极管深度解析 在光伏应用领域,旁路极管起着至关重要的作用。今天我们要深入探讨的就是德州仪器(TI)推出的SM74611智能旁路极管,它在性能和
    的头像 发表于 02-28 17:00 597次阅读

    深度解析LM73100:理想极管的卓越应用与设计秘籍

    深度解析LM73100:理想极管的卓越应用与设计秘籍 在电子设计领域,电源管理与保护一直是至关重要的环节。今天,我们将深入探讨德州仪器(TI)的LM73100,这是一款高度集成的理想极管,专为
    的头像 发表于 02-28 16:20 201次阅读

    LMH2190:一款高性能四通道时钟驱动器的深度剖析

    LMH2190:一款高性能四通道时钟驱动器的深度剖析 在当今的电子设备中,时钟信号的稳定与准确传输至关重要。对于移动手机、PDA和便携式设备等应用,对时钟驱动器的性能、尺寸和功耗都提出了极高的要求
    的头像 发表于 02-09 16:40 200次阅读

    入门宇机器人开发:从SDK源码探索到实战操作

    机器人(Unitree)作为全球领先的四足机器人研发企业,其推出的unitree_sdk2是面向旗下 Go2、H1、B2 等系列机器人的第代软件开发工具包。该 SDK 提供了丰富的接口和示例代码,支持开发者快速实现机器人控制、状态获取、传感器数据处理等功能,是入门宇
    的头像 发表于 02-06 16:43 3367次阅读
    入门宇<b class='flag-5'>树</b>机器人开发:从SDK源码探索到实战操作

    TÜV莱茵与杭集团达成战略合作并颁发欧盟CE-MD符合性证书

    日前,国际独立第三方检测、检验和认证机构德国莱茵TÜV大中华区(简称"TÜV莱茵")与杭集团股份有限公司(简称"杭集团")签署了战略合作协议,标志着双方
    的头像 发表于 01-15 12:18 446次阅读

    无线倾角传感器在古监测中的应用:以科技守护活文物的结构安全

    无线倾角传感器在古监测中的应用:以科技守护活文物的结构安全
    的头像 发表于 01-09 11:38 767次阅读
    无线倾角传感器在古<b class='flag-5'>树</b>监测中的应用:以科技守护活文物的结构安全

    亿纬锂能与杭集团达成战略合作

    近日,亿纬锂能与杭集团2025年战略研讨会暨战略合作协议签约仪式在杭州举行。亿纬锂能副总裁、商用车电池产品线总裁江吉兵博士,亿纬锂能商用车电池产品线国内销售部总经理井振江,杭集团董事、副总经理兼
    的头像 发表于 01-04 18:18 1179次阅读

    年薪100万以上模拟芯片专家的技能

    模拟专家的技能围绕核心电路设计能力、工具与流程掌握、行业特定技术深度、工程实践与管理能力四大维度展开,具体如下:一、核心电路设计与模块技术能力1.基础模拟模块设计功底通用模块精通:需熟练设计深亚
    的头像 发表于 11-12 17:42 1929次阅读
    年薪100万以上模拟芯片专家的技能<b class='flag-5'>树</b>

    通过优化代码来提高MCU运行效率

    选择时间复杂度低的算法。 根据访问模式选择数据结构。频繁查找用哈希表,有序数据用二叉树等。 查表法:对于复杂的数学计算(如sin, log),或者协议解析,预先计算好结果存于数组中,用空间换时间
    发表于 11-12 08:21

    蜂鸟E203内核中断管理模块sirv_plic_man代码分析

    。 上面的代码生成一个二叉树结构来比较和选择具有最大优先级的挂起中断源及其ID。树状结构由级联比较器组成,每一层的比较器数量是前一层的一半。在的每一层,选择优先级最高的中断并传递到下一层,直到只剩下
    发表于 10-23 06:05

    请问rtt studio 的文件夹打红什么意思?

    rtt studio 的文件夹打红什么意思?而且文件夹里面实际是有文件的,但是浏览不出来。
    发表于 09-18 06:34

    科技,被起诉

    电子发烧友网综合报道 天眼查显示,近日,杭州宇科技股份有限公司(以下简称“宇科技”)新增1条开庭公告,原告为杭州露韦美日化有限公司(以下简称“露韦美日化”),案由为侵害发明专利权纠纷,该案将于8
    的头像 发表于 08-26 07:50 5150次阅读
    宇<b class='flag-5'>树</b>科技,被起诉

    亿纬锂能荣获杭集团2022-2024年度优秀供应商奖

    近日,亿纬锂能凭借卓越产品、可靠交付与优质服务荣获杭集团颁发的“2022-2024年度优秀供应商”奖。杭集团副总经理兼杭电器董事长金华曙、杭电器总经理兼杭博电机总经理李明辉出席
    的头像 发表于 07-15 09:00 1102次阅读

    存储示波器的存储深度对信号分析有什么影响?

    测量结果波动大(如抖动测量误差±50%)。 案例: 测量100MHz时钟的周期抖动,存储深度10kpts → 抖动测量误差±10ps。 存储深度升级至1Mpts → 抖动测量误差±1ps。 、存储
    发表于 05-27 14:39