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为根节点的子树中,而不是直接通过根节点的左右子树。因此,必须递归地对每个子树的直径进行更新,寻找所有子树中左右子树深度之和的最大值,而不是直接求左右子树的深度。
热门推荐
如何理解货币汇率波动及其影响因素?这种汇率波动如何进行分析和应对?
如何养胃护胃食疗方法
疏肝解郁的中成药有什么
巨型亚马逊蚂蚁:世界上毒性最强的蚂蚁
戏剧中穆桂英等女将上阵,背插的几面旗,除了好看究竟有啥作用?
吴庄收费站:智慧化改造让“中国第一大站”更畅通
服务器内部的主板有哪些独特之处?
2025年交大医学遗传学课件:传承与创新并存
类地行星中,谁能成为下一个宜居星球
奥曲肽治疗胃肠道血管发育不良相关出血:一项多中心随机对照研究
小熊饼干爆红网络,你学会了吗?
银行理财产品的预期收益能保证实现吗?
银行的理财产品投资收益在节假日会有变化吗?
生辰八字四两命:命理特征与生活指南
四两八钱男命此乃官员:袁天罡称骨歌详解
中华十大观音圣像,见着增幅,转发者功德无量!
品质管理:驱动成功的关键力量
人血白蛋白正确的使用方法
多元文化的审美观念
系统架构师绩效考核指标有哪些?
甘南陇南天水7日环线旅游攻略,麦积山+甘南小独库公路+官鹅沟
洋葱炒牛肉这样做最好吃!
特讯高新技术认证教你读懂高企年报
研发投入占比:高企年报的关键指标
自然拼读法:让你的英语口语更地道!
烟酰胺护肤品:美白抗衰老效果如何?使用注意事项全解析
治消化系统疾病的8大类中药,它们都有哪些作用?
智能家居系统如何让防盗门更安全?
化工厂必备:防爆门有多重要?
人这一生,为什么得去一次泰山?