二叉树的最大深度(C语言详解版)

一、摘要

嗨喽呀大家,leetcode每日一题又和大家见面啦,今天要讲的是104.二叉树的最大深度,思路互相学习,有什么不足的地方欢迎指正!好啦让我们开始吧!!!

二、题目简介

给定一个二叉树 root ,返回其最大深度。

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

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100

三、思路详解

针对这道题我先补充一个递归的图像,能够帮我更好理解它递归的过程。图画由于是手画有点潦草

1. 递归法(深度优先搜索)

递归法是求解二叉树问题的常用方法。我们可以使用深度优先搜索(DFS)来遍历二叉树,找到从根节点到最远叶子节点的最长路径。

思路:
  • 如果当前节点为空,返回深度 0。

  • 递归计算左子树和右子树的最大深度。

  • 当前节点的最大深度等于左子树和右子树的最大深度中的较大值加 1。

代码实现:
int maxDepth(struct TreeNode* root) {if (root == NULL) return 0;  // 空节点的深度为0// 递归计算左子树和右子树的最大深度int leftDepth = maxDepth(root->left);int rightDepth = maxDepth(root->right);// 当前节点的最大深度为左右子树最大深度的较大值加1return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}

2. 迭代法(广度优先搜索)

迭代法使用队列来实现广度优先搜索(BFS),可以避免递归的深度限制问题。

思路:
  • 使用一个队列来存储待访问的节点,每个节点附带其深度信息。

  • 从根节点开始,将其深度设为 1。

  • 遍历队列中的每个节点,更新最大深度。

  • 将左右子节点(如果存在)加入队列,深度加 1。

代码实现:
int maxDepth(struct TreeNode* root) {if (root == NULL) return 0;  // 空树的最大深度为0struct TreeNode* queue[10000];  // 队列,假设最多10000个节点int depth[10000];  // 每个节点的深度int front = 0, rear = 0;int maxDepth = 0;queue[rear] = root;depth[rear] = 1;rear++;while (front < rear) {struct TreeNode* node = queue[front];int currentDepth = depth[front];front++;maxDepth = (currentDepth > maxDepth) ? currentDepth : maxDepth;if (node->left) {queue[rear] = node->left;depth[rear] = currentDepth + 1;rear++;}if (node->right) {queue[rear] = node->right;depth[rear] = currentDepth + 1;rear++;}}return maxDepth;
}

3. 前,中,后序遍历

思路:
  • 后序遍历:先计算左子树和右子树的最大深度,再处理当前节点。

  • 前序遍历:先处理当前节点,再计算左子树和右子树的最大深度。

  • 中序遍历:先计算左子树的最大深度,处理当前节点,再计算右子树的最大深度。

  • 在计算最大深度时,这些遍历顺序并没有实际影响,因为左右子树的最大深度是独立计算的,最终结果只取决于左右子树的最大深度。

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

  • 无论采用哪种遍历顺序(前序、中序、后序),最终都需要计算左子树和右子树的最大深度,并取较大值加 1。

代码实现:
int maxDepth(struct TreeNode* root) {if (root == NULL) return 0;  // 空节点的深度为0// 递归计算左子树和右子树的最大深度int leftDepth = maxDepth(root->left);int rightDepth = maxDepth(root->right);// 当前节点的最大深度为左右子树最大深度的较大值加1return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}

好啦,其实这类型的题目大致思路都是一样的,看完这些思路之后可以针对性的多做几道练习,今天的讲解就到这里啦。我们明天见! 

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

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

相关文章

开发环境搭建-3:配置 nodejs 开发环境 (fnm+ node + pnpm)

在 WSL 环境中配置&#xff1a;WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 node 官网&#xff1a;https://nodejs.org/zh-cn/download 点击【下载】&#xff0c;选择想要的 node 版本、操作系统、node 版本管理器、npm包管理器 根据下面代码提示依次执行对应代码即可 基本概…

HTB:Support[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用ldapsearch…

洛谷P1017 [NOIP2000 提高组] 进制转换

题目链接&#xff1a;P1017 [NOIP2000 提高组] 进制转换 - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及一 题目分析&#xff1a;这是道数学题&#xff0c;我们都知道&#xff0c;首先按照10进制转成n进制的做法&#xff1a;对这个数不断除以n&#xff0c;将余数一一…

php代码审计2 piwigo CMS in_array()函数漏洞

php代码审计2 piwigo CMS in_array()函数漏洞 一、目的 本次学习目的是了解in_array()函数和对项目piwigo中关于in_array()函数存在漏洞的一个审计并利用漏洞获得管理员帐号。 二、in_array函数学习 in_array() 函数搜索数组中是否存在指定的值。 in_array($search,$array…

【2024年华为OD机试】(A卷,200分)- 查找树中元素 (JavaScriptJava PythonC/C++)

一、问题描述 题目解析 题目描述 题目要求根据输入的坐标 (x, y) 在树形结构中找到对应节点的内容值。其中: x 表示节点所在的层数,根节点位于第0层,根节点的子节点位于第1层,依此类推。y 表示节点在该层内的相对偏移,从左至右,第一个节点偏移为0,第二个节点偏移为1,…

WPS数据分析000006

一、排序 开始→ 排序 同文件→选项→自定义序列→输入序列 二、筛选 高级筛选 条件区域要与列表区域一样。 三、条件格式

基于微信小程序的英语学习交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

记录一个连不上docker中的mysql的问题

引言 使用的debian12,不同发行版可能有些许差异&#xff0c;连接使用的工具是navicat lite 本来是毫无思绪的&#xff0c;以前在云服务器上可能是防火墙的问题&#xff0c;但是这个桌面环境我压根没有使用防火墙。 直到 ying192:~$ mysql -h127.0.0.1 -uroot ERROR 1045 (28…

SpringBoot基础概念介绍-数据源与数据库连接池

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 毛毛张今天介绍的SpringBoot中的基础概念-数据源与数据库连接池&#xff0c;同时介绍SpringBoot整合两种连接池的教程 文章目录 1 数据库与数据库管理系统2 JDBC与数…

深度学习 Pytorch 单层神经网络

神经网络是模仿人类大脑结构所构建的算法&#xff0c;在人脑里&#xff0c;我们有轴突连接神经元&#xff0c;在算法中&#xff0c;我们用圆表示神经元&#xff0c;用线表示神经元之间的连接&#xff0c;数据从神经网络的左侧输入&#xff0c;让神经元处理之后&#xff0c;从右…

GCC之编译(8)AR打包命令

GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-C…

SpringBoot统一功能处理

一.拦截器 1.拦截器的简单介绍 拦截器是Spring框架提供的核⼼功能之⼀,主要⽤来拦截⽤⼾的请求,在指定⽅法前后,根据业务需要执⾏预先设定的代码. 2.使用 (i).定义拦截器&#xff1a; (ii).注册拦截器 (iii).拦截路径 (iv).实行流程 3.登录校验 4.DispatcherServlet源码&…

31、Java集合概述

目录 一.Collection 二.Map 三.Collection和Map的区别 四.应用场景 集合是一组对象的集合&#xff0c;它封装了对象的存储和操作方式。集合框架提供了一组接口和类&#xff0c;用于存储、访问和操作这些对象集合。这些接口和类定义了不同的数据结构&#xff0c;如列表、集合…

Unity|小游戏复刻|见缝插针1(C#)

准备 创建Scenes场景&#xff0c;Scripts脚本&#xff0c;Prefabs预制体文件夹 修改背景颜色 选中Main Camera 找到背景 选择颜色&#xff0c;一种白中透黄的颜色 创建小球 将文件夹里的Circle拖入层级里 选中Circle&#xff0c;位置为左右居中&#xff0c;偏上&…

Word 中实现方框内点击自动打 √ ☑

注&#xff1a; 本文为 “Word 中方框内点击打 √ ☑ / 打 ☒” 相关文章合辑。 对第一篇增加了打叉部分&#xff0c;第二篇为第一篇中方法 5 “控件” 实现的详解。 在 Word 方框内打 √ 的 6 种技巧 2020-03-09 12:38 使用 Word 制作一些调查表、检查表等&#xff0c;通常…

Android Studio:视图绑定的岁月变迁(2/100)

一、博文导读 本文是基于Android Studio真实项目&#xff0c;通过解析源码了解真实应用场景&#xff0c;写文的视角和读者是同步的&#xff0c;想到看到写到&#xff0c;没有上帝视角。 前期回顾&#xff0c;本文是第二期。 private Unbinder mUnbinder; 只是声明了一个 接口…

第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)

1.并发编程的三个重要特性 并发编程有三个至关重要的特性&#xff0c;分别是原子性、有序性和可见性 1.1 原子性 所谓原子性是指在一次的操作或者多次操作中&#xff0c;要么所有的操作全部都得到了执行并 且不会受到任何因素的干扰而中断&#xff0c;要么所有的操作都不执行…

算法中的移动窗帘——C++滑动窗口算法详解

1. 滑动窗口简介 滑动窗口是一种在算法中常用的技巧&#xff0c;主要用来处理具有连续性的子数组或子序列问题。通过滑动窗口&#xff0c;可以在一维数组或字符串上维护一个固定或可变长度的窗口&#xff0c;逐步移动窗口&#xff0c;避免重复计算&#xff0c;从而提升效率。常…

基于SpringBoot的网上考试系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【java数据结构】map和set

【java数据结构】map和set 一、Map和Set的概念以及背景1.1 概念1.2 背景1.3 模型 二、Map2.1 Map说明2.2 Map的常用方法 三、Set3.1 Set说明3.2 Set的常用方法 四、Set和Map的关系 博客最后附有整篇博客的全部代码&#xff01;&#xff01;&#xff01; 一、Map和Set的概念以及…