原题
树与图简单1 种解法

#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

查看原题

解题主线

  1. 经过某节点的最长路径边数等于左右子树高度之和。

解法 1:后序高度与局部答案

后序返回高度,同时用方法内数组更新所有节点的左右高度和。

  • 时间复杂度: O(n)

  • 空间复杂度: O(h)

JAVA
import java.util.*;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
        this.val = val;
    }
}

class Solution {
    public int diameterOfBinaryTree(TreeNode root) {
        int[] diameter = new int[1];
        height(root, diameter);
        return diameter[0];
    }

    private int height(TreeNode node, int[] diameter) {
        // 空子树高度为 0,使叶子节点返回高度 1
        if (node == null) return 0;
        // 后序获取左右高度后,才能计算经过当前节点的路径
        int left = height(node.left, diameter);
        int right = height(node.right, diameter);
        // 左右高度之和恰好是该路径的边数
        diameter[0] = Math.max(diameter[0], left + right);
        // 向父节点只返回较长一侧的节点高度
        return Math.max(left, right) + 1;
    }
}

边界与易错点

  • 答案按边计数,而高度递归按节点层数返回。
  • 最大直径必须在每次公开方法调用时重置。

整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

  • leetcode/src/main/java/tree/Q543_tree_diameter.java