Java版LeetCode热题100之二叉树的直径:从深度计算到路径优化的全面解析

Java版LeetCode热题100之二叉树的直径:从深度计算到路径优化的全面解析

本文将深入剖析 LeetCode 第543题「二叉树的直径」,不仅提供深度优先搜索(DFS)的高效解法,还涵盖算法原理、复杂度分析、面试技巧、工程应用及关联题目拓展。全文约9500字,结构完整、内容翔实,适合准备面试或夯实算法基础的开发者阅读。


一、原题回顾

题目编号:LeetCode 543
题目名称:Diameter of Binary Tree(二叉树的直径)
难度等级:Easy(但极易出错)

题目描述

给你一棵二叉树的根节点root,返回该树的直径

二叉树的直径是指树中任意两个节点之间最长路径的长度
注意:这条路径可能经过也可能不经过根节点
路径长度= 路径上的边数(即节点数 - 1)。

示例

示例 1

输入:root = [1,2,3,4,5] 输出:3 解释:最长路径为 [4,2,1,3] 或 [5,2,1,3],包含4个节点,3条边。

树结构如下:

1 / \ 2 3 / \ 4 5

示例 2

输入:root = [1,2] 输出:1 解释:路径 [1,2],1条边。

约束条件

  • 树中节点数目在范围[1, 10⁴]
  • -100 <= Node.val <= 100

二、原题分析

什么是“二叉树的直径”?

  • 定义:任意两节点间的最长路径(按边数计算)。
  • 关键点
    • 路径不一定过根节点!这是最大误区。
    • 直径 =某节点左子树深度 + 右子树深度
    • 最终答案 = 所有节点的(左深度 + 右深度)的最大值

为什么这道题重要?

  1. 经典陷阱题:90% 的初学者会误以为“直径 = 左子树深度 + 右子树深度(以根为起点)”。
  2. 深度与路径的转化:考察对“深度”和“路径长度”关系的理解。
  3. 全局最优 vs 局部最优:需在递归中维护全局最大值。
  4. 面试高频题:常作为 DFS 和树形 DP 的入门考察。

💡核心洞察
树的直径 = max(所有节点的左深度 + 右深度)


三、答案构思

面对“求二叉树直径”问题,我们需要:

✅ 正确思路:深度优先搜索(DFS) + 全局变量
  • 核心思想
    • 对每个节点,计算其左子树深度 L右子树深度 R
    • 以该节点为“拐点”的最长路径 =L + R
    • 全局直径 = 所有节点的L + R的最大值
  • 实现方式
    • 递归函数depth(node)返回以node为根的子树深度
    • 同时用全局变量ans记录最大L + R + 1(节点数)
    • 最终返回ans - 1(转换为边数)
❌ 错误思路:仅计算根节点的左右深度
// 错误!未考虑不过根的路径returndepth(root.left)+depth(root.right);

我们将实现正确解法,并深入分析其原理。


四、完整答案(Java实现)

方法:深度优先搜索(DFS)

classSolution{privateintmaxDiameter=0;// 全局变量,记录最大直径(边数)publicintdiameterOfBinaryTree(TreeNoderoot){if(root==null)return0;computeDepth(root);returnmaxDiameter;}/** * 计算以 node 为根的子树深度(节点数) * 同时更新全局最大直径 */privateintcomputeDepth(TreeNodenode){if(node==null){return0;}// 递归计算左右子树深度intleftDepth=computeDepth(node.left);// 左子树深度(节点数)intrightDepth=computeDepth(node.right);// 右子树深度(节点数)// 以当前节点为拐点的路径长度(边数)= leftDepth + rightDepthmaxDiameter=Math.max(maxDiameter,leftDepth+rightDepth);// 返回当前子树的深度(节点数)= max(左, 右) + 1returnMath.max(leftDepth,rightDepth)+1;}}

官方写法(记录节点数,最后减1)

classSolution{intans;// 记录最大节点数publicintdiameterOfBinaryTree(TreeNoderoot){ans=1;depth(root);returnans-1;// 转换为边数}publicintdepth(TreeNodenode){if(node==null)return0;intL=depth(node.left);intR=depth(node.right);ans=Math.max(ans,L+R+1);// 节点数 = L + R + 1returnMath.max(L,R)+1;}}

📌两种写法等价

  • 第一种直接维护边数(maxDiameter = L + R
  • 第二种维护节点数(ans = L + R + 1),最后减1

五、代码分析

核心逻辑详解

  • 递归函数语义computeDepth(node)返回以 node 为根的子树的最大深度(节点数)
  • 直径计算时机:在得到左右子树深度后,立即计算leftDepth + rightDepth(边数)。
  • 全局更新maxDiameter在每次递归中尝试更新,确保捕获所有可能的“拐点”。

执行流程(以示例1为例)

1 / \ 2 3 / \ 4 5

递归调用栈(后序遍历):

  1. computeDepth(4)→ L=0, R=0 → maxD=0 → return 1
  2. computeDepth(5)→ L=0, R=0 → maxD=0 → return 1
  3. computeDepth(2)→ L=1, R=1 → maxD = max(0, 1+1)=2 → return 2
  4. computeDepth(3)→ L=0, R=0 → maxD=2 → return 1
  5. computeDepth(1)→ L=2, R=1 → maxD = max(2, 2+1)=3 → return 3

最终返回maxDiameter = 3(正确!)

💡关键理解
节点2作为“拐点”时,路径4-2-5长度为2;
节点1作为“拐点”时,路径4-2-1-35-2-1-3长度为3(最大)。


六、时间复杂度与空间复杂度分析

指标复杂度说明
时间复杂度O(n)每个节点被访问恰好一次
空间复杂度O(h)h 为树高,递归栈深度

详细解释:

时间复杂度:O(n)
  • 使用后序遍历,每个节点被访问一次。
  • 每次访问执行常数时间操作(比较、加法)。
  • 无重复计算,故线性时间。
空间复杂度:O(h)
  • 空间消耗来自递归调用栈
  • 栈深度 = 树的高度h
  • 最坏情况(链表):h = n→ O(n)
  • 最好情况(完全平衡):h = log₂n→ O(log n)

🔍为什么不是 O(n) 空间
虽然我们存储了全局变量,但额外空间仅由递归栈决定,与输入规模呈对数/线性关系。


七、常见问题解答(FAQ)

Q1:为什么不能直接返回depth(root.left) + depth(root.right)

:因为最长路径可能不过根节点!例如:

1 / 2 / \ 3 4 / 5
  • 根节点的左右深度:left=3, right=0→ 直径=3
  • 但实际最长路径是3-2-4-5(长度=3),确实过根
  • 反例
1 / 2 / \ 3 4 / \ 5 6
  • 根的左右深度:left=3, right=0→ 直径=3
  • 但节点4的左右深度:left=1, right=1→ 路径5-4-6长度=2
  • 最大直径仍是3(过根)
  • 真正反例需更复杂结构,但理论上存在不过根的更长路径

结论:必须检查所有节点作为拐点的情况!


Q2:直径一定是偶数吗?

不是。直径 = 边数,可以是奇数或偶数。

  • 示例2:[1,2]→ 直径=1(奇数)
  • 示例1:直径=3(奇数)
  • 若路径有4个节点 → 直径=3(奇数);5个节点 → 直径=4(偶数)

Q3:能否用 BFS 求直径?

可以,但效率低
BFS 通常用于求最短路径,而直径是最长路径。
一种方法是:

  1. 任选一点 A,BFS 找到最远点 B
  2. 从 B BFS 找到最远点 C
  3. B 到 C 的距离即为直径
    但需两次 BFS,且代码复杂,不如 DFS 简洁。

Q4:如果树是 BST,直径有什么特性?

无特殊性质。BST 的有序性不影响直径计算,仍需遍历所有节点。

Q5:如何返回具体的直径路径?

:需在递归中记录路径。可修改为:

privateList<Integer>longestPath=newArrayList<>();privateintcomputeDepth(TreeNodenode,List<Integer>path){// ... 类似逻辑,同时维护当前路径}

但会显著增加空间复杂度,通常只需返回长度。


八、优化思路

1. 避免全局变量(函数式风格)

可将maxDiameter作为引用传递(Java 不支持,需包装类):

classResult{intdepth;intdiameter;}privateResultcompute(TreeNodenode){if(node==null)returnnewResult(0,0);Resultleft=compute(node.left);Resultright=compute(node.right);intcurrDiameter=left.depth+right.depth;intmaxDiameter=Math.max(currDiameter,Math.max(left.diameter,right.diameter));returnnewResult(Math.max(left.depth,right.depth)+1,maxDiameter);}

但代码更冗长,通常全局变量更清晰。

2. 提前终止?

本题需遍历所有节点,无法提前终止。

3. 迭代实现?

可用显式栈模拟递归,但需存储(node, leftDepth, rightDepth)状态,代码复杂且无性能优势。

4. 并行计算?

理论上可并行计算左右子树,但:

  • 线程开销大
  • 树规模小(≤10⁴)
  • 无实际收益

5. 缓存子树深度?

本题无重复子问题,动态规划不适用。


九、数据结构与算法基础知识点回顾

1. 树的深度 vs 高度

  • 深度(Depth):从根到节点的边数(根深度=0)
  • 高度(Height):从节点到最远叶子的边数(叶子高度=0)
  • 子树深度:通常指高度(本题中depth(node)实际返回高度+1)

⚠️本题术语
depth(node)返回的是节点数(高度+1),但直径计算用边数(高度)

2. 后序遍历的重要性

  • 为什么必须后序
    因为需要先知道子树信息,才能计算当前节点的直径。
  • 前序/中序无法保证子树已处理。

3. 全局最优的维护

  • 在递归中,局部最优(当前节点直径)可能不是全局最优
  • 必须用全局变量或返回复合结果来跟踪最大值

4. 路径的表示

  • 简单路径:树中任意两节点间有且仅有一条简单路径
  • 直径路径:必然是简单路径,且存在一个最高点(拐点)

5. 边数 vs 节点数

  • 路径长度(边数)= 节点数 - 1
  • 本题明确要求边数,务必注意转换

十、面试官提问环节(模拟对话)

面试官:你提到最长路径可能不过根节点,能举个例子吗?
:考虑这棵树:

1 / 2 / \ 3 4 / \ 5 6 / 7
  • 根节点1的左右深度:3 和 0 → 直径=3
  • 但节点4的左右深度:1 和 2 → 路径5-4-6-7长度=3
  • 实际最大直径可能出现在更深的子树中

面试官:你的解法时间复杂度是多少?
:O(n),每个节点访问一次。

面试官:空间复杂度呢?
:O(h),h 是树高,由递归栈决定。

面试官:如果要求返回路径本身,怎么做?
:可以在递归时传递当前路径列表,当发现更长路径时更新全局最优路径。但空间复杂度会升至 O(n²)。

面试官:这道题和“最大路径和”有什么关系?
:非常相似!LeetCode 124 题“二叉树中的最大路径和”也是找任意路径的最大值,只是把“边数”换成“节点值之和”,解法几乎 identical。

面试官:能否不用全局变量?
:可以,让递归函数返回(depth, maxDiameterInSubtree),但代码会更复杂。全局变量在此场景下更清晰。


十一、这道算法题在实际开发中的应用

1. 网络拓扑分析

  • 计算通信网络中最远两点的距离(延迟上限)
  • P2P 网络中优化节点连接策略

2. 文件系统性能评估

  • 目录树的直径反映最大嵌套深度
  • 过大的直径可能导致路径过长,影响 I/O 性能

3. 社交网络影响力传播

  • 用户关系树中,直径表示信息传播的最大跳数
  • 用于设计病毒式营销的初始节点选择

4. 编译器优化(AST 分析)

  • 抽象语法树的直径反映表达式的最大嵌套层级
  • 可用于警告用户避免过度复杂的表达式

5. 游戏 AI(决策树)

  • 决策树的直径表示最长决策链
  • 影响 AI 响应时间和内存占用

6. 生物信息学(进化树)

  • 物种进化树的直径表示最大进化距离
  • 用于研究物种分化的时间尺度

十二、相关题目推荐

掌握本题后,可挑战以下进阶题目:

题号题目关联点
124二叉树中的最大路径和几乎 identical,求和代替计数
104二叉树的最大深度基础深度计算
110平衡二叉树自底向上返回高度
543*N 叉树的直径推广到多叉树
112路径总和简单路径问题
129求根到叶子节点数字之和路径值计算
257二叉树的所有路径枚举所有路径

🔥重点推荐

  • 第124题:本题的“升级版”,考察相同模式下的变体。
  • 第110题:同样需要自底向上返回高度,但用于平衡判断。

十三、总结与延伸

核心收获

  1. 破除思维定势

    • 直径不一定过根节点
    • 必须检查所有可能的“拐点”
  2. 深度与路径的转化

    • 子树深度是构建路径的基础
    • 路径长度 = 左深度 + 右深度(边数)
  3. 全局最优的维护

    • 递归中局部结果 ≠ 全局最优
    • 需用全局变量或复合返回值跟踪
  4. 后序遍历的威力

    • 自底向上传递信息
    • 完美适配“子问题合并”场景

延伸思考

  • N 叉树的直径
    需找到深度最大的两个子树:max1 + max2

  • 带权树的直径
    边有权重,需修改为max(leftWeightedDepth + rightWeightedDepth)

  • 动态直径
    若树支持插入/删除,可维护每个节点的 top-2 深度,实现 O(log n) 更新

  • 分布式计算
    在大规模树(如社交网络)中,需设计分布式算法计算直径

最后建议

  • 面试准备:务必理解“不过根”的陷阱,并能手写 DFS 解法。
  • 工程实践:此模式(DFS + 全局最优)广泛用于树形 DP 问题。
  • 算法竞赛:类似问题(如最大路径和)是高频考点。

结语:二叉树的直径看似简单,却完美融合了深度计算、路径分析和全局优化思想。它不仅是面试的经典考题,更是理解树形动态规划的绝佳入口。愿你在刷题路上,既能避开常见陷阱,也能掌握通用解题范式。

欢迎点赞、收藏、评论交流!你的支持是我持续输出高质量内容的动力!

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

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

相关文章

2025-2026年徐州高品质住宅评选与推荐报告:于深度调整期中寻找价值确定性 - 2026年企业推荐榜

开篇引言:一个改善家庭的选房困局与市场之变 2025年初,徐州的李先生开始为家庭置换一套终极改善住房。他的需求明确:核心地段、顶尖产品力、国企或优质品牌保障、以及能够穿越周期的资产价值。然而,在市场调研中他…

杭州市英语雅思培训辅导机构推荐,2026权威出国雅思课程排行榜 - 苏木2025

雅思培训领域,杭州市备考群体普遍面临诸多痛点:选课乱象丛生,优质教育机构鱼龙混杂,难从海量口碑排名筛选靠谱选项;考试备考缺乏系统规划,提分技巧不精准,提分效果大打折扣;多数机构教学方案无个性化适配,无法…

2026年金亿重工高臂钻机市场口碑推荐,浙江地区用户评价分析 - 工业品牌热点

在工程建设领域,一款高效可靠的高臂钻机是解决复杂边坡施工难题的核心装备,关乎项目进度、施工安全与成本控制。面对市场上琳琅满目的高臂钻机品牌,如何挑选一款适配自身施工需求、口碑过硬的产品?以下结合用户痛点…

泉州市英语雅思培训辅导机构推荐;2026权威出国雅思课程排行榜 - 苏木2025

基于英国文化教育协会《2024-2025中国大陆地区雅思考生成绩大数据报告》核心洞察,结合泉州鲤城区、丰泽区、洛江区、泉港区、晋江市等区域考生备考痛点,本次通过权威、全面、深度测评,围绕雅思培训选课核心诉求,从…

Java版LeetCode热题100之二叉树的层序遍历:从BFS到多维拓展的全面解析

Java版LeetCode热题100之二叉树的层序遍历&#xff1a;从BFS到多维拓展的全面解析本文将深入剖析 LeetCode 第102题「二叉树的层序遍历」&#xff0c;不仅提供广度优先搜索&#xff08;BFS&#xff09;的标准解法&#xff0c;还涵盖算法原理、复杂度分析、面试技巧、工程应用及…

逆向 讀墨Readmoo iOS客户端:Readium LCP加密

中国台湾电子书主流平台之一的读墨Readmoo拥有十分全面的书库,虽然其使用的支付平台为 藍新金流NewebPay 导致不支持银联UnionPay,国内发卡行的VISA/MasterCard也可能拒付,对中国大陆并不友好。 但是出于读墨采用了…

ACPI!ACPIBuildProcessRunMethodPhaseCheckSta函数对节点BAT1方法_STA的处理在异步线程ACPI!ACPIWorker

ACPI!ACPIBuildProcessRunMethodPhaseCheckSta函数对节点BAT1方法_STA的处理在异步线程ACPI!ACPIWorker 0: kd> kc# 00 ACPI!ACPIBuildProcessRunMethodPhaseCheckSta 01 ACPI!ACPIBuildProcessGenericList 02 ACPI!ACPIBuildDeviceDpc 03 nt!KiRetireDpcList 04 nt!KiDispa…

学霸同款8个AI论文写作软件,MBA论文高效搞定!

学霸同款8个AI论文写作软件&#xff0c;MBA论文高效搞定&#xff01; AI 工具如何助力论文写作&#xff0c;让学术之路更高效 在当今快速发展的学术环境中&#xff0c;MBA 学生和科研工作者面临着越来越高的论文写作要求。传统的写作方式不仅耗时费力&#xff0c;还容易因格式不…

2026年工业滤芯厂家权威推荐榜单:除杂滤芯/活性炭滤芯/精密滤芯/吸气滤芯/聚结分离滤芯源头厂家精选 - 品牌推荐官

在工业流体分离领域,滤芯作为核心部件直接影响系统运行效率与稳定性。河南纵达过滤设备有限公司凭借年产10万件(套)的规模化生产能力,成为国内滤芯制造领域的重要参与者。其产品覆盖天然气滤芯、氢气滤芯、聚结滤芯…

2026必备!专科生毕业论文必备的9款AI论文工具深度测评

2026必备&#xff01;专科生毕业论文必备的9款AI论文工具深度测评 2026年专科生毕业论文必备AI工具测评指南 随着人工智能技术的不断发展&#xff0c;越来越多的专科生开始借助AI工具提升毕业论文写作效率。然而面对市场上琳琅满目的论文辅助软件&#xff0c;如何选择真正适合自…

互联网大厂Java面试实战:Spring Boot、微服务与AI技术综合解析

文章内容&#xff1a; 本文以在线教育场景为背景&#xff0c;讲述一位严肃的面试官与搞笑的水货程序员谢飞机之间的三轮面试对话。面试围绕Java核心技术、构建工具、Web框架、数据库ORM、微服务架构、缓存、安全、消息队列以及AI技术展开&#xff0c;层层递进&#xff0c;帮助求…

户外广告投放平台哪家合适?通广传媒多场景服务超给力 - 工业品牌热点

在城市化进程加速与品牌传播需求多元化的当下,户外广告作为连接品牌与消费者的线下核心触点,其投放平台的选择直接关乎品牌曝光效率与转化效果。面对市场上琳琅满目的户外广告投放公司,如何破解效果难评估、反馈滞后…

泉州市英语雅思培训辅导机构推荐,2026权威出国雅思课程排行榜 - 苏木2025

经国际教育测评研究院联合雅思备考指导中心发起,基于2026年度《闽南地区雅思培训行业发展白皮书》,结合泉州市及石狮市、南安市、惠安县、安溪县、永春县五地12000余名雅思考生调研数据、72家教育机构实地探访及3个月…

南京市英语雅思培训辅导机构推荐,2026权威出国雅思课程排行榜 - 苏木2025

经教育部教育考试院相关标准指导、结合《2024-2025中国大陆雅思成绩大数据报告》及南京市5000份雅思考生调研问卷、60家机构实测数据,本次开展权威、全面的深度测评,旨在解决南京考生在雅思培训过程中面临的核心困境…

学长亲荐2026研究生必用TOP10一键生成论文工具测评

学长亲荐2026研究生必用TOP10一键生成论文工具测评 学术写作工具测评&#xff1a;为何需要一份2026年权威榜单 随着人工智能技术的不断进步&#xff0c;学术写作工具在研究生群体中的使用率逐年攀升。然而&#xff0c;面对市场上琳琅满目的AI写作产品&#xff0c;如何选择真正…

2026年石墨烯涂料设计怎么找,石墨烯涂料/无溶剂环氧涂料/环氧玻璃钢/环氧酚醛,石墨烯涂料生产厂家怎么选择 - 品牌推荐师

近年来,随着工业防腐需求的升级与环保政策的收紧,石墨烯涂料凭借其优异的导电性、耐腐蚀性和机械性能,逐渐成为管道、桥梁、船舶等领域的核心材料。然而,市场鱼龙混杂,如何筛选出技术领先、服务可靠、资质齐全的优…

企业运维实战:Linux系统远程连接完整指南

一、操作系统准备阶段 1. 操作系统下载与安装虚拟机环境配置:建议使用VMware/VirtualBox等工具创建Linux虚拟机 系统选择:CentOS/Ubuntu等主流发行版均可2. Linux网络基础配置配置概念:configure表示系统或软件配置…

杭州市英语雅思培训辅导机构推荐;2026权威出国雅思课程排行榜 - 苏木2025

雅思培训中,选课难、考试达标难是考生及家长的核心困境。如何筛选优质靠谱的教育机构,获取实用提分技巧与个性化方案,直接决定雅思高分成败。基于此,我们依托权威测评体系与海量学员反馈,开展全面深度测评,形成2…

基于NSGA-II算法的电动汽车充电负荷优化研究 - MATLAB代码实现

Matlab ‖ 峰谷电价引导下电动汽车充电负荷优化-基于NSGA-II算法 关键词&#xff1a;电动汽车 充电负荷 NSGA-II算法 峰谷电价 参考文档&#xff1a;《基于峰谷分时电价引导下的电动汽车充电负荷优化》基本复现&#xff1b; 仿真平台&#xff1a;MATLAB 研究内容&#xff1…

厦门市英语雅思培训辅导机构推荐;2026权威出国雅思课程排行榜 - 苏木2025

基于2026年雅思考试最新趋势及厦门地区考生备考数据,结合思明区、湖里区、集美区、海沧区、同安区、翔安区不同考生的学习需求,本文开展全面深度测评,聚焦雅思培训选课核心痛点,从优质课程供给、高分提分逻辑、技巧…