LeetCode刷题:二叉树的直径问题详解
创作时间:
作者:
@小白创作中心
LeetCode刷题:二叉树的直径问题详解
引用
1
来源
1.
https://developer.aliyun.com/article/1646916
给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 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
解题思路
这是一道经典的二叉树递归题目。关键在于理解二叉树直径的定义:任意两个节点之间的最长路径长度。这条路径可能经过也可能不经过根节点。
错误思路:直接计算左右子树的最大深度之和。这种思路的误区在于,直径的路径不一定存在于根节点的一级子树中。
正确思路:需要递归地对每个子树的直径进行更新,寻找所有子树中左右子树深度之和的最大值。
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int max=0;
public int diameterOfBinaryTree(TreeNode root) {
if (root == null) return 0;
deep(root);
return max;
}
private int deep(TreeNode root) {
if (root == null) return 0;
// 递归计算左子树和右子树的最大深度
int leftDepth = deep(root.left);
int rightDepth = deep(root.right);
max=Math.max(max,leftDepth+rightDepth);
// 当前节点的最大深度是左子树和右子树深度的最大值加一
return 1 + Math.max(leftDepth, rightDepth);
}
}
思路分析
通过图示可以更直观地理解为什么直接计算左右子树深度之和是错误的:
如图所示,直径路径实际上存在于以-9为根节点的子树中,而不是直接通过根节点的左右子树。因此,必须递归地对每个子树的直径进行更新,寻找所有子树中左右子树深度之和的最大值,而不是直接求左右子树的深度。
热门推荐
狗狗体质差怎么调理?
怎么教小狗拔河游戏
紧急避难场所设立指南
详解吸音板材料类型
如何面试大数据架构师
电脑界面切换全攻略:Windows、Mac系统对比分析
全面解析:在岸业务与离岸业务的区别及各自优势
十大大脑最大的动物:按体积和智力排列
柚子是什么季节的水果?几月份才是应季?
黄精烘干工艺
从废弃到新生:小龙虾壳助力微塑料治理的创新之路
网络安全防护:如何通过防火墙避免内部威胁?
降低心率的训练方法
从近视宅男买早餐到彭罗斯逆矩阵(1):矩阵乘法|N文粗通线性代数
青石板的种类
出入量不再是难题,护士开发APP赢得赞誉!
驾驶证到期了?别急,“交管12123”APP网上轻松办!
壬水生于戌月命理分析
GRU原理解读
上市首日涨1917% N红四方成年内“最牛”新股
APT攻击预警平台:原理、部署与功能详解
"五一"假期,“花”式广府美食盛放
蓝色枸杞和普通枸杞的区别、哪个更好、名称及功效作用对比
被子越重,睡得越香!最新研究显示:盖上7kg左右的厚被子,显著改善睡眠
企业组织架构图中各部门之间的协作方式是怎样的?
船舶登记案例⑲丨反向保理,您遇到了吗?
苹果和桂圆一起煮的功效与作用
制定有效短期计划的五个关键步骤
工程项目清单变更怎么做
SPSS统计分析之配对样本单因素方差分析实例