題目描述:給定二元樹,找出任意節點到任意節點的路徑中,節點值總和最大的路徑和。
解題思路:後序 DFS:對每個節點,計算「以此節點為根向下的最大單邊路徑增益」(取左右子樹增益的正值部分)。同時,用全域變數記錄最大路徑和,更新為 node.val + leftGain + rightGain(左右都延伸的情況)。遞迴函數回傳向上的最大貢獻(只能選一側)。
時間複雜度:O(n) — 每個節點後序訪問一次。
空間複雜度:O(h) — 遞迴棧深度(h 為樹高)。
1. maxSum = -infinity 2. DFS(node): a. If null: return 0 b. leftGain = max(0, DFS(left)) c. rightGain = max(0, DFS(right)) d. maxSum = max(maxSum, node.val + leftGain + rightGain) e. Return node.val + max(leftGain, rightGain) 3. Return maxSum
自底向上 DP O(n) 時間,O(h) 空間:遞迴計算每節點的最大路徑和,在遍歷中更新全域最大值 — 邏輯相同,但此即標準方法。
迭代後序遍歷 O(n) 時間,O(h) 空間:顯式堆疊模擬遞迴 — 複雜但避免系統遞迴。