问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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为根节点的子树中,而不是直接通过根节点的左右子树。因此,必须递归地对每个子树的直径进行更新,寻找所有子树中左右子树深度之和的最大值,而不是直接求左右子树的深度。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号