当前位置: 首页 > news >正文

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。

http://www.jsqmd.com/news/352117/

相关文章:

  • GPU内存检测与硬件诊断实用指南
  • 颠覆式桌面整理:NoFences极简空间管理解决方案
  • 告别黑边束缚:让经典游戏在宽屏显示器上实现视觉重生
  • Dify缓存配置失效真相(生产环境凌晨告警复盘实录)
  • 探索游戏模组加载器的无限可能:ModTheSpire全方位解析
  • 【Dify 0.9+审计增强指南】:强制启用审计日志、自定义审计策略、对接SIEM的7个必须修改的YAML参数
  • 轻量级全平台德州扑克GTO求解器:Desktop Postflop技术解析与实战指南
  • bilibili-downloader:突破4K画质限制的B站视频下载全方案
  • Desktop Postflop:德州扑克GTO求解器的技术架构与实践指南
  • 基于SSM的毕业设计项目实战:从零搭建高内聚低耦合的Web应用
  • 从零构建工业质检数据集:金属缺陷标注实战与YOLO适配技巧
  • 局域网游戏联机神器:无网环境下跨平台多人游戏解决方案
  • 突破账号限制的游戏启动器:发现离线游戏自由新可能
  • 游戏模组工具:解锁《杀戮尖塔》的无限可能
  • 电源设计中如何精准计算电感值?Buck-Boost计算器的工程应用指南
  • AI驱动的画质增强工具Video2X:3步法+避坑指南
  • 告别下载卡顿烦恼:这款浏览器提速工具让文件传输快如闪电
  • Markdown转换与网页保存:高效内容管理的格式转换工具全解析
  • 2026年耐磨钢板厂家最新推荐:耐磨钢板卷圆、NM600耐磨钢板、耐磨钢板铣槽、Mn13耐磨钢板、NM550耐磨钢板选择指南 - 优质品牌商家
  • OpenWRT应用商店安装失败完全解决指南:从报错分析到功能验证
  • 3D资源管理终极指南:Space Thumbnails提升模型预览效率全攻略
  • 多模态Agent上线前必做的6项Dify集成压力测试,错过第4项将导致37%的跨模态推理静默丢帧
  • 颠覆传统文档处理的开源方案:OFDRW全功能文档工具链实战指南
  • 5步解锁极速体验:网盘提速工具全平台下载解决方案
  • 3分钟突破Mac NTFS限制:免费工具实现完整读写权限的终极指南
  • 5个实用技巧让窗口调整工具成为你的多任务处理利器
  • 三步解构Desktop Postflop:从项目架构到配置指南
  • uBlock Origin技术指南:从基础到进阶的全方位适配方案
  • 如何在Linux系统访问BitLocker加密盘?这款开源工具让跨平台数据交互效率提升300%
  • 解锁文本分析工具的业务价值:零基础上手的实战秘诀