算法的学习笔记—二叉树的深度(牛客JZ55)

news2024/10/27 22:41:56

在这里插入图片描述

img

😀前言
在二叉树的相关操作中,计算树的深度是一个非常基础但十分重要的操作。本文将详细解析如何计算一棵二叉树的深度,并通过代码实现来展示具体的解决方案。

🏠个人主页:尘觉主页

文章目录

  • 💝二叉树的深度
    • ❤️‍🔥问题描述
      • 示例
      • 数据范围
    • 💞解题思路
      • 思路分析
    • 🥰代码实现
      • 代码解析
      • 时间复杂度分析
      • 空间复杂度分析
    • 😄总结

💝二叉树的深度

NowCoder

❤️‍🔥问题描述

给定一棵二叉树,求出它的深度。树的深度定义为从根节点到最远叶节点的最长路径所经过的节点总数。根节点的深度视为 1。

示例

假设输入的二叉树如下图所示:

img

在该树中,最长的路径是从根节点 1 开始,经过节点 2 和节点 5,最后到达节点 7,总共经过 4 个节点。因此,这棵树的深度为 4。

数据范围

  • 节点的数量满足 0 ≤ n ≤ 100。
  • 节点上的值满足 0 ≤ val ≤ 100。

进阶要求:空间复杂度 O(1),时间复杂度 O(n),即要求算法的效率要足够高。

💞解题思路

二叉树的深度问题可以通过递归的方式进行解决。二叉树的深度等于其左右子树深度的最大值加 1,即:

  • 树的深度 = 1 + max(左子树的深度, 右子树的深度)

思路分析

  1. 递归终止条件:当遇到空节点时,返回 0。因为空节点不贡献任何深度。
  2. 递归过程:从根节点开始,分别计算左子树和右子树的深度。取左、右子树深度的较大值,并加 1(因为需要包括根节点),就是当前树的深度。

通过这种方式,递归地向下遍历整棵树,最终返回二叉树的最大深度。

🥰代码实现

根据上述思路,我们可以很容易地实现递归的深度计算算法,代码如下:

public class Solution {
    public int TreeDepth(TreeNode root) {
        // 如果根节点为空,深度为 0
        if (root == null) {
            return 0;
        }
        // 递归计算左子树和右子树的深度,返回最大值并加 1(当前节点的深度)
        return 1 + Math.max(TreeDepth(root.left), TreeDepth(root.right));
    }
}

代码解析

  1. 递归结束条件:当 root == null 时,说明当前节点为空,返回深度 0。
  2. 递归求解:通过 Math.max 函数,取左子树和右子树深度的较大值,并加 1 表示当前节点的深度。

以题目示例二叉树为例:

  • 节点 4 和节点 7 都是叶节点,它们的深度是 1。
  • 节点 5 的深度是 1 + max(0, 1) = 2。
  • 节点 2 的深度是 1 + max(1, 2) = 3。
  • 节点 6 的深度是 1。
  • 节点 3 的深度是 1 + max(0, 1) = 2。
  • 最后根节点 1 的深度是 1 + max(3, 2) = 4。

最终计算出树的深度为 4。

时间复杂度分析

该算法对每个节点仅访问一次,因此时间复杂度为 O(n),其中 n 是树中的节点数量。在最坏情况下,树是一个链状结构,算法需要遍历每一个节点。

空间复杂度分析

空间复杂度主要由递归调用栈的深度决定,最坏情况下,递归深度等于树的高度。因此,空间复杂度为 O(H),其中 H 是树的高度。对于平衡二叉树来说,H 约为 O(log n),而在最坏情况下(例如链状树),H 可能为 O(n)。

😄总结

通过递归求解二叉树的深度是一种非常直观且高效的方式。该方法充分利用了二叉树的结构特点,逐层递归计算子树的深度,并最终得到整棵树的最大深度。递归的实现简洁明了,适用于各种不同的二叉树结构。

掌握这种递归思路,不仅可以轻松解决类似的树深度问题,还能够应用于其他树相关的操作,如判断树的平衡性、计算树的最大路径等。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

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

相关文章

了解 .NET 8 中的定时任务或后台服务:IHostedService 和 BackgroundService

IHostedService.NET 8 引入了使用和管理后台任务的强大功能BackgroundService。这些服务使长时间运行的操作(例如计划任务、后台处理和定期维护任务)可以无缝集成到您的应用程序中。本文探讨了这些新功能,并提供了实际示例来帮助您入门。您可…

HarmonyOS开发 - 本地持久化之实现LocalStorage实例

用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。 说明&#x…

同步电机不同电流参考方向下的功率计算

同步电机的功率计算有时候会看见两种表达方式: 当以发电机惯例,即电流方向输出时,功率计算式为: { P s 3 2 ( u s d i s d u s q i s q ) Q s 3 2 ( u s q i s d − u s d i s q ) \left\{\begin{array}{l} P_{\mathrm{s}}\fr…

PostgreSQL(十三)pgcrypto 扩展实现 AES、PGP 加密,并自定义存储过程

目录 一、pgcrypto 简介1.1 安装 pgcrypto 扩展1.2 pgcrypto 包含的函数 二、用法①:对称加密(使用 AES、Blowfish 算法)2.1 密钥2.2 密钥偏移量 三、用法②:PGP加解密3.1 什么是PGP算法?3.2 使用 GPG 生成密钥对3.3 列…

【AI大模型】深入解析 存储和展示地理数据(.kmz)文件格式:结构、应用与项目实战

文章目录 1. 引言2. 什么是 .kmz 文件?2.1 .kmz 文件的定义与用途2.2 .kmz 与 .kml 的关系2.3 常见的 .kmz 文件使用场景 3. .kmz 文件的内部结构3.1 .kmz 文件的压缩格式3.2 解压缩 .kmz 文件的方法3.3 .kmz 文件的典型内容3.4 .kml 文件的结构与主要元素介绍 4. 深…

豆包MarsCode Agent 登顶 SWE-bench Lite 评测集

大语言模型(LLM)能力正在迅速提升,对包括软件工程在内的诸多行业产生了深远影响。GPT-4o、Claude3.5 等 LLM 已经逐步展现出胜任复杂任务的能力,例如文本总结、智能客服、代码生成,甚至能够分析和解决数学问题。在这一…

为什么在网络中不能直接传输数据

为什么在网络中不能直接传输数据 原因 在网络中不能直接传输原始数据形式,主要有以下几方面原因: 数据表示的多样性:不同的计算机系统、编程语言和应用程序对数据的表示方式可能各不相同。例如,整数在不同的编程语言中可能有不同…

了解Java开发中的会话层

在现代Web应用开发中,会话管理是一个至关重要的概念。它涉及到如何在客户端和服务器之间保持用户状态信息,从而提供个性化、连续的用户体验。Java作为一种广泛使用的编程语言,在Web开发中扮演着重要角色,特别是在企业级应用中。了…

基于neo4j的课程资源生成性知识图谱

你是不是还在为毕业设计苦恼?又或者想在课堂中进行知识的高效管理?今天给大家分享一个你一定会感兴趣的技术项目——基于Neo4j的课程资源生成性知识图谱!💡 这套系统通过知识图谱的形式,将课程资源、知识点和学习路径…

一文掌握异步web框架FastAPI(五)-- 中间件(测试环境、访问速率限制、请求体解析、自定义认证、重试机制、请求频率统计、路径重写)

接上篇:一文掌握异步web框架FastAPI(四)-CSDN博客 目录 七、中间件 15、测试环境中间件 16、访问速率限制中间件,即限制每个IP特定时间内的请求数(基于内存,生产上要使用数据库) 1)限制单ip访问速率 2)增加限制单ip并发(跟上面的一样,也是限制每个IP特定时间内的请…

vue2结合echarts实现数据排名列表——前端柱状进度条排行榜

写在前面,博主是个在北京打拼的码农,工作多年做过各类项目,最近心血来潮在这儿写点东西,欢迎大家多多指教。 数据排名列表——图表开发,动态柱状图表,排名图 UI 直接搜到类似在线代码(数据列表…

事务的原理、MVCC的原理

事务特性 数据库事务具有以下四个基本特性,通常被称为 ACID 特性: 原子性(Atomicity):事务被视为不可分割的最小工作单元,要么全部执行成功,要么全部失败回滚。这意味着如果事务执行过程中发生…

交换机:端口安全与访问控制指南

为了实现端口安全和访问控制,交换机通常通过以下几种机制和配置来保护网络,防止未经授权的访问和恶意攻击。 01-端口安全 定义及功能 端口安全功能允许管理员限制每个交换机端口可以学习的MAC地址数量。 通过绑定特定的MAC地址到交换机的某一端口上&a…

二十二、Python基础语法(模块)

模块(module):在python中,每个代码文件就是一个模块,在模块中定义的变量、函数、类别人都可以直接使用,如果想要使用别人写好的模块,就必须先导入别人的模块,模块名须满足标识符规则(由字母、数…

MFC七段码显示实例

在MFC中添加iSenvenSegmentAnalogX控件,添加编辑框和按钮实现在编辑框中输入数字点击按钮后数字用七段码显示 1、在对话框中点击右键如下图添加控件和变量 2、在sevenDlg.h中添加代码 public: void ShowInd(int,double);3、在sevenDlg.cpp中添加代码 void CSe…

将 el-date-picker获取的时间数据转换成时间戳

在Vue.js中使用Element UI的el-date-picker组件时,你可以获取用户选择的日期并将其转换为时间戳。el-date-picker通常返回的是一个Date对象或一个格式化后的字符串(取决于你如何配置它)。下面是一个示例,展示了如何将el-date-pick…

攻防世界的新手web题解

攻防世界引导模式 1、disabled_button 好&#xff0c;给了一个按钮&#xff0c;第一道题目就不会做 看的wp<input disabled class"btn btn-default" style"height:50px;width:200px;" type"submit" value"flag" name"auth&q…

来源爬虫程序调研报告

来源爬虫程序调研报告 一、什么是爬虫 爬虫&#xff1a;就是抓取网页数据的程序。从网站某一个页面&#xff08;通常是首页&#xff09;开始&#xff0c;读取网页的内容&#xff0c;找到在网页中的其它链接地址&#xff0c;然后通过这些链接地址寻找下一个网页&#xff0c;这…

植物健康,Spring Boot来保障

5系统详细实现 5.1 系统首页 植物健康系统需要登录才可以看到首页。具体界面的展示如图5.1所示。 图5.1 系统首页界面 5.2 咨询专家 可以在咨询专家栏目发布消息。具体界面如图5.2所示。 图5.2 咨询专家界面 5.3 普通植物检查登记 普通员工可以对普通植物检查登记信息进行添…

07 设计模式-结构型模式-桥接模式

桥接&#xff08;Bridge&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模式属于结构型模式&#xff0c;它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&#xff0c;使得…