LeetCode题目104: 二叉树的最大深度(递归\迭代\层序遍历\尾递归优化\分治法实现 )

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!

  • 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注
    在这里插入图片描述

  • 导航

    • LeetCode解锁1000题: 打怪升级之旅:每题都包括3-5种算法,以及详细的代码实现,刷题面试跳槽必备
    • 漫画版算法详解:通过漫画的形式和动态GIF图片把复杂的算法每一步进行详细可视解读,看一遍就掌握
    • python源码解读:解读python的源代码与调用关系,快速提升代码质量
    • python数据分析可视化:企业实战案例:企业级数据分析案例与可视化,提升数据分析思维和可视化能力
    • 程序员必备的数学知识与应用:全面详细的介绍了工程师都必备的数学知识

期待与您一起探索技术、持续学习、一步步打怪升级 欢迎订阅本专栏❤️❤️

题目描述

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

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

示例:

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

    3/ \9  20/  \15   7

最大深度是 3。

方法一:递归

解题步骤

  1. 如果节点为空,返回深度 0。
  2. 递归计算左子树的最大深度。
  3. 递归计算右子树的最大深度。
  4. 返回左右子树深度的最大值加一(当前节点的深度)。

Python 示例

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef maxDepth(root):if not root:return 0return 1 + max(maxDepth(root.left), maxDepth(root.right))

算法分析

  • 时间复杂度:O(N),其中 N 为树的节点数,每个节点访问一次。
  • 空间复杂度:O(H),其中 H 为树的高度,因为递归栈的深度由树的高度决定。

算法图解与说明

  3            <-- Level 1/ \
9  20          <-- Level 2/  \15   7        <-- Level 3调用栈情况(以节点3为例):
maxDepth(3)
=> maxDepth(9), maxDepth(20)=> maxDepth(null), maxDepth(null), maxDepth(15), maxDepth(7)

方法二:迭代(使用栈)

解题步骤

  1. 使用栈来模拟递归过程,每个元素为节点及其当前深度。
  2. 初始化栈包含根节点和深度 1。
  3. 当栈不为空,弹出节点并更新最大深度。
  4. 将节点的左右子节点及其深度压入栈中。

Python 示例

def maxDepthIterative(root):if not root:return 0stack = [(root, 1)]max_depth = 0while stack:node, depth = stack.pop()if node:max_depth = max(max_depth, depth)stack.append((node.left, depth + 1))stack.append((node.right, depth + 1))return max_depth

算法分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

算法图解与说明

栈的操作示例:
初始: [(3, 1)]
操作: 弹出(3, 1), 压入(9, 2), 压入(20, 2)
接着: 弹出(20, 2), 压入(15, 3), 压入(7, 3)
接着: 弹出(7, 3), 弹出(15, 3), 弹出(9, 2)

方法三:层序遍历(使用队列)

解题步骤

  1. 使用队列实现层序遍历。
  2. 每遍历完一层,深度加一。

Python 示例

from collections import dequedef maxDepthUsingBFS(root):if not root:return 0queue = deque([root])depth = 0while queue:for _ in range(len(queue)):node = queue.popleft()if node.left:queue.append(node.left)if node.right:queue.append(node.right)depth += 1return depth

算法分析

  • 时间复杂度:O(N)

  • 空间复杂度:O(N)

算法图解与说明

队列操作示例:
初始: [3]
操作: 弹出3, 压入9, 压入20
接着: 弹出9, 弹出20, 压入15, 压入7
接着: 弹出15, 弹出7

方法四:尾递归优化

解题步骤

  1. 使用尾递归形式来优化递归的性能。
  2. 传递当前深度作为参数,避免额外的递归开销。

Python 示例

def maxDepthTailRecursive(root, depth=0):if not root:return depthreturn max(maxDepthTailRecursive(root.left, depth + 1), maxDepthTailRecursive(root.right, depth + 1))

算法分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(H),利用尾递归优化,Python 中不一定有效,取决于解释器是否优化尾调用。

算法图解与说明

递归调用栈(尾递归):
maxDepthTailRecursive(3, 0)
=> maxDepthTailRecursive(9, 1), maxDepthTailRecursive(20, 1)=> maxDepthTailRecursive(null, 2), ...

方法五:分治法

解题步骤

  1. 对每个节点,分别求解左右子树的最大深度。
  2. 合并左右子树深度的结果,取最大值加一。

Python 示例

def maxDepthDivideAndConquer(root):if not root:return 0left_depth = maxDepthDivideAndConquer(root.left)right_depth = maxDepthDivideAndConquer(root.right)return 1 + max(left_depth, right_depth)

算法分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(H)

算法图解与说明

分治递归过程:
maxDepthDivideAndConquer(3)
=> maxDepthDivideAndConquer(9), maxDepthDivideAndConquer(20)=> maxDepthDivideAndConquer(null), maxDepthDivideAndConquer(null), ...

应用示例

上述各方法均适用于任何形式的二叉树结构,可以有效解决实际问题中的深度计算问题。

🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)

❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)
在这里插入图片描述

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

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

相关文章

Android system property运作流程源码分析

一.序 前文分析了build.prop这个系统属性文件的生成&#xff0c;每个属性都有一个名称和值&#xff0c;他们都是字符串格式。属性被大量使用在Android系统中&#xff0c;用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性&#x…

【IMX6ULL项目】IMX6ULL下Linux实现产测工具框架

电子产品量产测试与烧写工具。这是一套软件&#xff0c;用在我们的实际生产中&#xff0c; 有如下特点&#xff1a; 1.简单易用&#xff1a; 把这套软件烧写在 SD 卡上&#xff0c;插到 IMX6ULL 板子里并启动&#xff0c;它就会自动测试各个模块、烧写 EMMC 系统。 工人只要按…

数据库系统理论——关系数据库标准语言SQL

文章目录 一、数据定义1、基本表的定义、删除与修改2、索引的建立于删除&#xff08;了解&#xff09; 二、数据查询&#xff08;会其中一种&#xff09;1、单表查询&#xff08;1&#xff09;这里出现重复元组&#xff0c;怎么处理&#xff1f;&#xff1f;&#xff08;2&…

渗透测试-信息收集

网络安全信息收集是网络安全领域中至关重要的一环&#xff0c;它涉及到对目标系统、网络或应用进行全面而细致的信息搜集和分析。这一过程不仅有助于理解目标网络的结构、配置和潜在的安全风险&#xff0c;还能为后续的渗透测试、风险评估和安全加固提供有力的支持。 在网络安…

单调栈问题

原理 单调栈的核心原理是&#xff1a;在栈内保持元素的单调性&#xff08;递增或递减&#xff09; 单调递增栈&#xff1a; 用于处理“下一个更小的元素”问题。当新元素比栈顶元素小或等于时&#xff0c;直接入栈&#xff1b;否则&#xff0c;一直从栈顶弹出元素&#xff0c…

信息系统项目管理师0102:可行性研究的内容(7项目立项管理—7.2项目可行性研究—7.2.1可行性研究的内容)

点击查看专栏目录 文章目录 7.2项目可行性研究7.2.1可行性研究的内容1.技术可行性分析2.经济可行性分析3.社会效益可行性分析4.运行环境可行性分析5.其他方面的可行性分析记忆要点总结7.2项目可行性研究 可行性研究是在项目建议书被批准后,从技术、经济、社会和人员等方面的条…

在STM32中用寄存器方式点亮流水灯

文章目录 实验资料一、对寄存器的理解1.通俗认识寄存器2.深入了解寄存器&#xff08;1&#xff09;端口配置低寄存器&#xff08;配置0到7引脚的寄存器&#xff09;&#xff08;2&#xff09;端口配置高寄存器&#xff08;配置8到15引脚&#xff09; 3.GPIO口的功能描述 二、配…

【网络】网络基础

目录 一、前言 1.计算机网络背景 2.认识协议 二、网络协议初识 1.OSI七层模型 2.TCP/IP五层(或四层)模型 3.网络传输基本流程 4.数据包封装和分用 5.网络中的地址管理 1.IP地址 2.MAC地址 一、前言 1.计算机网络背景 网络之前&#xff0c;我们所有在电脑上的操作都是…

LeetCode题练习与总结:二叉树的中序遍历--94

一、题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;roo…

Github学习

1.Git与Github 区别: Git是一个分布式版本控制系统&#xff0c;简单的说就是一个软件&#xff0c;用于记录一个或若干个文件内容变化&#xff0c;以便将来查阅特点版本修订情况的软件。 Github是一个为用户提高Git服务的网站&#xff0c;简单说就是一个可以放代码的地方。Gi…

韩顺平0基础学Java——第10天

p202-233 类与对象&#xff08;第七章&#xff09; 成员方法 person类中的speak方法&#xff1a; 1.public表示方法是公开的 2.void表示方法没有返回值 3.speak&#xff08;&#xff09;中&#xff0c;speak表示方法名&#xff0c;括号是形参列表。 4.大括号为方法体&am…

重塑数据架构:云器Lakehouse如何简化组装式架构实现性能与成本的精益平衡

导读本文将介绍云器科技自研的 Lakehouse 产品。通过本次分享&#xff0c;您将了解云器 Lakehouse 产品特性&#xff0c;了解一体化数据平台如何提升数据处理和数据分析的效率&#xff0c;使之更轻松、更简洁、更高效&#xff0c;了解增量计算如何做到平衡数据新鲜度、查询性能…

DE2-115串口通信

目录 一、 内容概要二、 Hello Nios-II2.1 Nios-II编程2.1.1 硬件Ⅰ 搭建环境Ⅱ 编写代码 2.1.2 软件2.1.3 烧录Ⅰ硬件Ⅱ 软件 2.2 verilog编程 三、 心得体会 一、 内容概要 分别用Verilog和Nios软件编程, 实现DE2-115开发板串口输出“Hello Nios-II”字符到笔记本电脑串口助…

【Shell】shell编程之循环语句

目录 1.for循环 例题 2.while循环 例题 3.until循环 1.for循环 读取不同的变量值&#xff0c;用来逐个执行同一组命令 for 变量 in 取值列表 do 命令序列 done [rootlocalhost ~]# for i in 1 2 3 > do > echo "第 $i 次跳舞" > done 第 1 次跳舞 第 …

使用Pycharm编写Python程序时对基本类结构中方法的重写的两种初步操作方式

使用Pycharm编写Python程序时对基本类结构中方法的重写的两种初步操作方式 Python和其他一些高级面向对象的编程语言中&#xff0c;子类可继承父类中的方法&#xff0c;而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法&#xff0c;而是想作一定的修改&…

闲来装个虚拟机Ubuntu24.04和硬盘分区及挂载

简述 最近ubuntu出新版本了&#xff0c;ubuntu24.04&#xff0c; 俗称高贵食蚁兽。5年前进行Android或者linux开发基本是在windows下的虚拟机中进行。目前&#xff0c;虽然物质基础提高了&#xff0c;功能有独立进行编译、代码管理的服务器了。可以通过ssh登录&#xff0c;但是…

【C++11】C++11类与模板语法的完善

目录 一&#xff0c;新的类功能 1-1&#xff0c;默认成员函数 1-2&#xff0c;强制生成关键字 二&#xff0c;可变参数模板 2-1&#xff0c;模板参数包 2-2&#xff0c;STL容器empalce的相关接口 一&#xff0c;新的类功能 1-1&#xff0c;默认成员函数 C11之前的类中有…

Tomcat添加服务以及设置开机自启

下载地址连接 Index of /dist/tomcat&#x1f453; 注意点&#xff1a;不要出现中文路径 #环境变量 CATALINA_HOMED:\apache-tomcat-7.0.62 TOMCAT_HOMED:\apache-tomcat-7.0.62 JAVA_HOMED:\tool\jdk1.8.0_111 PATH%CATALINA_HOME%\bin;%CATALINA_HOME%\lib;%CATALINA_HOME%\…

对称加密介绍

一、什么是对称加密 对称密钥算法(Symmetric-key algorithm)&#xff0c;又称为对称加密、私钥加密、共享密钥加密&#xff0c;是密码学中的一类加密算法。 对称加密的特点是&#xff0c;在加密和解密时使用相同的密钥&#xff0c;或是使用两个可以简单地相互推算的密钥。 这…

超越传统游戏:生成式人工智能对游戏的变革性影响

人工智能&#xff08;AI&#xff09;在游戏中的应用 游戏产业是一个充满活力、不断发展的领域&#xff0c;人工智能&#xff08;AI&#xff09;的融入对其产生了重大影响。这一技术进步彻底改变了游戏的开发、玩法和体验方式。本文分析的重点是传统人工智能和生成式人工智能在游…