算法:计算二叉树的最大深度(Java实现)

news2025/1/1 14:26:09

思路

  1. 定义问题: 最大深度(或称为最大层数)是从根节点到最远叶子节点的路径上的节点数。我们需要找到这个最长路径的节点数。

  2. 递归的基本思路

    • 对于每个节点,我们需要计算其左子树的最大深度和右子树的最大深度。
    • 节点的最大深度是其左子树和右子树最大深度中的较大值加一(加上当前节点)。
  3. 递归终止条件

    • 如果节点为空(即树为空或到达叶子节点的子节点),深度为0。
  4. 递归步骤

    • 计算当前节点的左子树深度。
    • 计算当前节点的右子树深度。
    • 当前节点的深度是左子树和右子树深度的最大值加一。

示例代码解析

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class BinaryTree {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = maxDepth(root.left);  // 递归计算左子树的深度
        int rightDepth = maxDepth(root.right); // 递归计算右子树的深度
        return Math.max(leftDepth, rightDepth) + 1; // 当前节点的深度是左右子树深度的最大值加1
    }

    public static void main(String[] args) {
        // 示例用法
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        BinaryTree tree = new BinaryTree();
        System.out.println("Maximum Depth: " + tree.maxDepth(root)); // 输出最大深度
    }
}

步骤详解

  1. TreeNode

    • 这是一个树节点类,包含节点值val和左右子节点leftright
  2. maxDepth方法

    • 检查当前节点是否为空。如果为空,返回0(表示没有深度)。
    • 递归计算左子树和右子树的深度。
    • 使用Math.max(leftDepth, rightDepth)计算左右子树的最大深度。
    • 将最大深度加1(包括当前节点),并返回这个值。
  3. main方法

    • 构造一个示例二叉树。
    • 调用maxDepth方法并打印结果。

递归的优点

  • 简洁明了,容易理解。
  • 递归会自然处理树的结构,适用于树形结构的问题。

这个方法的时间复杂度是O(n),其中n是树中的节点数,因为每个节点都被访问一次。空间复杂度在最坏情况下是O(h),其中h是树的高度(递归栈的深度)。

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

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

相关文章

54.【C语言】 字符函数和字符串函数(strncpy,strncat,strncmp函数)

和strcpy,strcat,strcmp函数对应的是strncpy,strncat,strncmp函数 8.strncpy函数 *简单使用 cplusplus的介绍 点我跳转 翻译: 函数 strncpy char * strncpy ( char * destination, const char * source, size_t num ); 从字符串中复制一些字符 复制源(source)字符串的前num个…

Redis详细解析

Redis 什么是Redis?关系型与非关系型数据库Redis可以做什么Redis入门安装在Windows系统上安装在Linux系统上安装 Redis在Linux系统上启动运行如何设置redis-server后台运行与关闭如何设置redis客户端登录时需要验证密码**设置允许远程连接redis服务**Redis数据类型Redis常用命…

魔方财务迁移指南

本文将详细介绍如何将魔方财务系统迁移到新的服务器,确保您能够顺利地迁移数据和系统文件。 迁移前的准备 在开始迁移之前,请确保新服务器满足以下配置要求: 操作系统:CentOS/Debian/Ubuntu硬件配置:至少2H2G&#…

RP2040 C SDK ADC功能使用

RP2040 C SDK ADC功能使用 🌿RP2040 ADC功能说明文档:https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#hardware_adc 📗RP2040 ADC介绍 SAR ADC500 kS/s (Using an independent 48MHz clock)12 bit (RP2040 8.7 ENOB, R…

建筑资质与劳务资质的区别

在建筑行业,资质就像是企业的“身份证”,它证明了企业具备承接相应工程的能力和条件。对于刚入行的小白来说,可能会对建筑资质和劳务资质的区别感到困惑。别担心,今天我们就来聊聊这两者之间的不同。 什么是建筑资质? …

git push : RPC failed; HTTP 400 curl 22 The requested URL returned error: 400

git push 出现RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 问题 git push Enumerating objects: 11, done. Counting objects: 100% (11/11), done. Delta compression using up to 8 threads Compressing objects: 100% (10/10), done. error: RPC …

分布式训练:(Pytorch)

分布式训练是将机器学习模型的训练过程分散到多个计算节点或设备上,以提高训练速度和效率,尤其是在处理大规模数据和模型时。分布式训练主要分为数据并行和模型并行两种主要策略: 1. 数据并行 (Data Parallelism) 数据并行是最常见的分布式…

数据结构之树的常用术语

二叉树的常用术语 前言 由于数组在插入、删除上的缺点和链表在查询上的缺点,出现了树的数据结构,可以在增删改查中弥补数组和链表的缺陷。 常用数据 节点:每个节点根节点:最上层的节点,Root节点父节点:相…

基于SSM的宿舍管理系统的设计与实现 (含源码+sql+视频导入教程)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的宿舍管理系统拥有两种角色,分别为管理员和宿管,具体功能如下: 管理员:学生管理、班级管理、宿舍管理、卫生管理、访客管理、用户…

SOT23封装1A电流LDO具有使能功能的 1A、低 IQ、高精度、低压降稳压器系列TLV757P

前言 SOT23-5封装的外形和丝印 该LDO适合PCB空间较小的场合使用,多数SOT23封装的 LDO输出电流不超过0.5A。建议使用时输入串联二极管1N4001,PCB布局需要考虑散热,参考文末PCB布局。 1 特性 • 采用 SOT-23 (DYD) 封装,具有 60.3C/W RθJA •…

双指针算法专题(2)

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: 优选算法专题 想要了解双指针算法的介绍,可以去看下面的博客:双指针算法的介绍 目录 611.有效三角形的个数 LCR 1…

【天池比赛】【零基础入门金融风控 Task2赛题理解】实战进行中……20240915更新至2.3.4.3 查看训练集测试集中特征属性只有一值的特征

2.3 代码示例 2.3.1 导入数据分析及可视化过程需要的库 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import datetime import warnings warnings.filterwarnings(ignore) 2.3.2 读取文件 #读取数据时相对路径载入报错时…

【Redis】之Geo

概述 Geo就是Geolocation的简写形式,代表地理坐标。在Redis中,构造了能够存储地址坐标信息的一种数据结构,帮助我们根据经纬度来检索数据。 命令行操作方法 GEOADD 可以用来添加一个或者多个地理坐标。 GEODIST 返回一个key中两个成员之…

AgentTuning:提升大型语言模型的通用Agent能力

人工智能咨询培训老师叶梓 转载标明出处 大模型被用作现实中复杂任务的Agent时,它们的表现往往不如商业模型,如ChatGPT和GPT-4。这些任务要求LLMs作为中央控制器,负责规划、记忆和工具利用,这就需要精巧的提示方法和鲁棒性强的LL…

华为的仓颉和ArkTS这两门语言有什么区别

先贴下官网: ArkTs官网 仓颉官网 ArkTS的官网介绍说,ArkTS是TypeScript的进一步强化版本,简单来说就是包含了TS的风格,但是做了一些改进。 了解TypeScript的朋友都应该知道,其实TypeScript就是JavaScript的改进版本&…

基于springboot 自习室预订系统 前后端分离

基于springboot 自习室预订系统 前后端分离 目 录 摘 要 I Abstract II 第1章 前 言 2 1.1 研究背景 3 1.2 研究现状 3 1.3 系统开发目标 3 第2章 系统开发环境 5 2.1 java技术 5 2.2 Mysql数据库 6 2.3 B/S结构 7 2.4 springboot框架 7 2.5 ECLIPSE 开发环境 7 …

Redis的配置与优化

目录 一、关系数据库与非关系型数据库 1.1、关系型数据库 1.2、非关系型数据库 1.3、关系型数据库和非关系型数据库区别 数据存储方式不同 扩展方式不同 对事务性的支持不同 1.4、非关系型数据库产生背景 二、Redis简介 2.1、Redis优点 2.2、Redis为什么这么快 三、…

CefSharp_Vue交互(Element UI)_WinFormWeb应用---设置应用透明度(含示例代码)

一、界面预览 1.1 设置透明(整个页面透明80%示例) 限制输入值:10-100(数字太小会不好看见) 1.2 vue标题栏 //注册类与js调用 (async function(

速通汇编(五)认识段地址与偏移地址,CS、IP寄存器和jmp指令,DS寄存器

一,地址的概念 通常所说的地址指的是某内存单元在整个机器内存中的物理地址,把整个机器内存比作一个酒店,内存单元就是这个酒店的各个房间,给这些房间编的门牌号,类比回来就是内存单元的物理地址 在第一篇介绍debug的…

Scratch植物大战僵尸【机器人vs外星人版本】

小虎鲸Scratch资源站-免费少儿编程Scratch作品源码,素材,教程分享网站! 简介 在这个教学案例中,我们将制作一个类似《植物大战僵尸》的Scratch游戏,主题为“机器人对抗外星人”。这个版本将采用创新的角色设计,机器人将保护地球免受外星人入…