news 2026/6/10 18:04:42

day167—递归—二叉树的直径(LeetCode-543)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day167—递归—二叉树的直径(LeetCode-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

解决方案:

这段代码是基于后序遍历(DFS)求解二叉树直径的经典实现,核心思路是通过递归计算每个节点的左右子树深度,同时统计以该节点为 “拐弯点” 的路径长度,最终得到整棵树的最大直径。

核心逻辑

  1. 核心定义

    • ans:全局变量,记录二叉树的最大直径(即所有路径中的最长长度);
    • dfs(node):递归函数,返回以node为根的子树的深度(从node到最远叶子节点的边数),同时在递归过程中更新全局最大直径。
  2. 递归边界:若node为空(!node),返回 0(空树深度为 0)。

  3. 后序遍历核心逻辑

    • 先递归计算左子树深度l_len = dfs(node->left)
    • 再递归计算右子树深度r_len = dfs(node->right)
    • 关键操作:以当前节点为 “拐弯点” 的路径长度是l_len + r_len(左子树深度 + 右子树深度),用该值更新全局最大值ans
    • 返回当前子树的深度:max(l_len, r_len) + 1(取左右子树深度的最大值,加 1 表示当前节点到子树的一条边)。
  4. 主函数逻辑:调用dfs(root)触发递归遍历整棵树,最终返回全局最大值ans(即二叉树的直径)。

关键特点

  • 时间复杂度 O (n):每个节点仅被递归访问一次,n 为节点数;
  • 空间复杂度 O (h):h 为树的高度,递归栈深度等于树高(平衡树 h=logn,退化为链表 h=n);
  • 逻辑简洁:将 “计算子树深度” 和 “统计最大直径” 融合在一次 DFS 中,无需额外遍历;
  • 直径定义:二叉树的直径是 “任意两个节点之间的最长路径长度”(路径长度 = 边数),该代码精准统计了所有可能的路径(以每个节点为拐弯点)。

验证示例(简单二叉树)

假设有如下二叉树:

plaintext

1 / \ 2 3 / \ 4 5
  • 递归到节点 2 时,l_len=1(节点 4)、r_len=1(节点 5),ans更新为1+1=2
  • 递归到节点 1 时,l_len=2(节点 2 的子树深度)、r_len=1(节点 3 的子树深度),ans仍为 2(2+1=3?此处修正:该例子中节点 1 的l_len=2r_len=1ans会更新为 3,对应路径 4-2-5(长度 2)或 4-2-1-3(长度 3),最终直径为 3);
  • 最终返回ans=3,符合实际最长路径长度。

总结

  1. 核心思路:通过后序遍历递归计算子树深度,同时统计每个节点作为 “拐弯点” 的路径长度,取最大值即为二叉树直径;
  2. 关键设计:dfs函数兼具 “返回子树深度” 和 “更新最大直径” 两个职责,是该问题的最优解法;
  3. 功能效果:能正确计算任意二叉树的直径,时间 / 空间效率均为最优。

函数源码:

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: int ans=0; int dfs(TreeNode* node){ if(!node) return 0; int l_len=dfs(node->left); int r_len=dfs(node->right); ans=max(ans,l_len+r_len); return max(l_len,r_len)+1; } int diameterOfBinaryTree(TreeNode* root) { dfs(root); return ans; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 2:15:09

HBase监控与调优:关键指标与工具推荐

HBase监控与调优:关键指标与工具推荐 关键词:HBase监控、性能调优、关键指标、监控工具、JVM调优、RegionServer、分布式系统 摘要:本文深入解析HBase监控与调优的核心技术体系,系统阐述服务器级、HBase服务级、JVM级、Region与Store级关键指标的原理与阈值判断,提供硬件配…

作者头像 李华
网站建设 2026/6/10 14:58:05

校平机背后的力学奥秘:为什么反复弯曲能让金属变平整?

金属板材变形如同揉皱的纸张&#xff0c;而校平机的智慧在于"以曲制曲"——通过精密的弯曲来消除弯曲。残余应力&#xff1a;变形的罪魁祸首金属板材在轧制、切割或冲压后&#xff0c;内部会残留不均匀的内应力。想象一块被拉着两端的橡皮筋&#xff1a;如果一侧拉得…

作者头像 李华
网站建设 2026/6/10 3:09:52

全网最全自考必备AI论文软件TOP9:测评对比与推荐

全网最全自考必备AI论文软件TOP9&#xff1a;测评对比与推荐 自考人群为何需要专业AI论文工具&#xff1f; 随着自考人数逐年增长&#xff0c;论文写作成为许多考生面临的重大挑战。从选题构思到文献检索&#xff0c;从内容撰写到格式规范&#xff0c;每一步都可能成为阻碍进度…

作者头像 李华
网站建设 2026/6/9 15:42:15

华为OD技术面真题 - JAVA开发 - 1

文章目录 JAVA跨平台是如何实现的面向对象三大特性重写和重载的区别讲讲JAVA中不同访问权限修饰符区别为什么要设计不同访问权限修饰符String、StringBuffer和StringBuilder区别HashCode、 和 equals的区别 JAVA跨平台是如何实现的 java中经典的Write Once, Run Anywhere是基于…

作者头像 李华
网站建设 2026/6/10 14:45:45

Java毕设项目:基于springboot的校园资讯分享平台的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/10 14:47:54

【Django毕设全套源码+文档】基于Django的校园荣誉证书管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华