news 2026/4/26 19:40:18

543. 二叉树的直径

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
543. 二叉树的直径

543. 二叉树的直径
简单

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

二叉树的直径是指树中任意两个节点之间最长路径的长度。这条路径可能经过也可能不经过根节点root

两节点之间路径的长度由它们之间边数表示。

示例 1:

输入:root = [1,2,3,4,5] 输出:3 解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

示例 2:

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

提示:

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

📝 核心笔记:二叉树的直径 (Diameter of Binary Tree)

1. 核心思想 (一句话总结)

“每个节点都做两件事:1. 试图把左右臂展连起来挑战世界纪录;2. 挑一只长手臂伸向长官汇报。”

  • 直径不一定经过根节点:它可能完全出现在左子树或右子树内部。
  • 转化问题:直径 = 某一个节点处的(左子树最大链长 + 右子树最大链长)的最大值。
  • 我们利用后序遍历,在回溯的过程中,算出以当前节点为“拐点”的最长路径,并不断更新全局最大值。
2. 您的“边数计算”逻辑 (return -1)

这是一个非常棒的细节:

  • Null 节点:返回-1
  • 叶子节点:左 (-1) + 1 = 0,右 (-1) + 1 = 0。链长为 0。正确(叶子没边)。
  • 中间节点:假设左子树高L,右子树高R
    • lLen = L + 1(连上左边那条边)。
    • rLen = R + 1(连上右边那条边)。
    • 这种写法直接把+1分摊到了每一层递归里,非常优雅。
🔍 代码回忆清单
// 题目:LC 543. Diameter of Binary Tree class Solution { // 1. 全局变量:记录遍历过程中遇到的"最大臂展" // 类似于打擂台,谁的 (左+右) 更长,谁就当老大 private int ans; public int diameterOfBinaryTree(TreeNode root) { dfs(root); return ans; } // 返回值含义:从当前节点向下,能延伸出的【最大单边链长】(边数) private int dfs(TreeNode node) { // 2. Base Case: 巧妙的 -1 // 既然我们算的是"边数",null 节点贡献 -1, // 这样它的父节点 (叶子) 加上 1 之后刚好是 0 if (node == null) { return -1; } // 3. 后序遍历:先拿到左右的情报 int lLen = dfs(node.left) + 1; // 左边最长链 + 连接左子树的那条边 int rLen = dfs(node.right) + 1; // 右边最长链 + 连接右子树的那条边 // 4. 更新全局最大直径 (Hook) // 假设路径经过当前节点 (穿过),那长度就是 左 + 右 ans = Math.max(ans, lLen + rLen); // 5. 向上汇报 // 只能选一条最长的路继续往上延伸 (不能分叉) return Math.max(lLen, rLen); } }
⚡ 快速复习 CheckList (易错点)
  • [ ]为什么不能直接 returnlLen + rLen
    • 这是初学者最容易犯的错。
    • dfs函数的职责是“向上汇报高度”。如果返回lLen + rLen,相当于告诉父节点“我是一条分叉的线”,但路径是不能分叉的。父节点只能接你的左手右手。
    • 只有在更新全局ans时,才考虑“分叉/拐弯”的情况。
  • [ ]直径通过根节点吗?
    • 不一定。
    • 比如树的左边特别深,像个大哑铃,直径可能就在左子树内部。所以必须用全局变量ans在遍历过程中实时抓取最大值。
  • [ ]时间复杂度?
    • 每个节点遍历一次。
🖼️ 数字演练

树结构:

1 / \ 2 3 / \ 4 5
  1. Node 4 (Leaf):
    • dfs(null)returns -1.
    • lLen= -1+1=0,rLen= -1+1=0.
    • ans= max(0, 0+0) = 0.
    • Return: 0.
  1. Node 5 (Leaf):
    • Return: 0.
  1. Node 2:
    • lLen(from 4) = 0 + 1 = 1.
    • rLen(from 5) = 0 + 1 = 1.
    • ans= max(0, 1+1) =2. (路径 4-2-5)
    • Return: max(1, 1) = 1. (告诉 1 号节点,我这边最长能提供 1 条边的深度)
  1. Node 3 (Leaf):
    • Return: 0.
  1. Node 1 (Root):
    • lLen(from 2) = 1 + 1 = 2.
    • rLen(from 3) = 0 + 1 = 1.
    • ans= max(2, 2+1) =3. (路径 4-2-1-3)
    • Return: 2.

最终结果: 3。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 7:45:10

AI智能客服实战:如何通过NLP优化提升80%工单处理效率

背景痛点&#xff1a;工单系统“慢”在哪里 去年做客服中台重构时&#xff0c;我们拿到一份触目惊心的数据&#xff1a;日均 3.2w 张工单&#xff0c;峰值时段队列积压 1.8w 张&#xff0c;平均首响 47min&#xff0c;客户投诉率飙升到 12%。 传统架构的“慢”主要卡在三点&a…

作者头像 李华
网站建设 2026/4/17 21:17:50

AI视频增强工具Video2X完全指南:从安装到高级应用

AI视频增强工具Video2X完全指南&#xff1a;从安装到高级应用 【免费下载链接】video2x A lossless video/GIF/image upscaler achieved with waifu2x, Anime4K, SRMD and RealSR. Started in Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

作者头像 李华
网站建设 2026/4/16 9:08:20

YimMenu完全掌握指南:从环境搭建到高级功能的安全实践

YimMenu完全掌握指南&#xff1a;从环境搭建到高级功能的安全实践 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimM…

作者头像 李华
网站建设 2026/4/25 17:10:51

简单的Web前端毕业设计:从零实现一个可部署的实战项目

简单的Web前端毕业设计&#xff1a;从零实现一个可部署的实战项目 摘要&#xff1a;许多计算机专业学生在完成毕业设计时&#xff0c;常因缺乏工程化思维而陷入“能跑就行”的陷阱&#xff0c;导致项目难以部署、维护或展示。本文以“简单的Web前端毕业设计”为切入点&#xff…

作者头像 李华
网站建设 2026/4/25 5:18:40

为什么92%的Dify国产化项目卡在数据库迁移?——达梦DM8字符集冲突、BLOB字段截断、序列伪列缺失三大致命陷阱详解

第一章&#xff1a;Dify国产化部署测试全景概览Dify 作为一款开源的低代码大模型应用开发平台&#xff0c;其国产化适配能力是政企用户关注的核心指标。本章聚焦于在主流国产软硬件生态下的全栈部署与功能验证&#xff0c;涵盖操作系统&#xff08;麒麟V10、统信UOS&#xff09…

作者头像 李华