Easy草稿★★★★O(n) 時間 · O(h) 空間
TreeDFSRecursion
Patterns🌳 樹形 DFS
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

543Diameter of Binary TreeTreesEasyTrees

給定一棵二元樹,求其直徑。直徑定義為任意兩個節點之間最長路徑的邊數。此路徑不一定經過根節點。

Example:

Input: root = [1,2,3,4,5] Output: 3 (路徑為 4 -> 2 -> 1 -> 3 或 5 -> 2 -> 1 -> 3)

Intuition

TIP

對每個節點,經過它的最長路徑 = 左子樹高度 + 右子樹高度;全域追蹤最大值。

Approaches

1. Brute Force (compute per node) — O(n^2) / O(n)
  • Idea: 對每個節點計算其左右子樹高度之和,取最大值。每次計算高度需要遍歷子樹。
  • Time: O(n^2),最差情況下每個節點都要重新計算高度
  • Space: O(n)
class Solution {
    fun diameterOfBinaryTree(root: TreeNode?): Int {
        if (root == null) return 0
        val throughRoot = height(root.left) + height(root.right)
        val leftDiameter = diameterOfBinaryTree(root.left)
        val rightDiameter = diameterOfBinaryTree(root.right)
        return maxOf(throughRoot, leftDiameter, rightDiameter)
    }

    private fun height(node: TreeNode?): Int {
        if (node == null) return 0
        return 1 + maxOf(height(node.left), height(node.right))
    }
}
⭐ 2. DFS Computing Height & Diameter — O(n) / O(h)
  • Idea: 在計算每個節點高度的遞迴過程中,同時更新全域直徑變數
  • Time: O(n)
  • Space: O(h)
class Solution {
    private var diameter = 0

    fun diameterOfBinaryTree(root: TreeNode?): Int {
        diameter = 0
        height(root)
        return diameter
    }

    private fun height(node: TreeNode?): Int {
        if (node == null) return 0
        val left = height(node.left)
        val right = height(node.right)
        diameter = maxOf(diameter, left + right)
        return 1 + maxOf(left, right)
    }
}

🔑 Takeaways