MediumRating 1375
1038. Binary Search Tree to Greater Sum Tree
treedepth-first-searchbinary-search-treebinary-tree
解題說明
Binary Search Tree to Greater Sum Tree
題目描述: 將一棵二元搜尋樹(BST)轉換為 Greater Sum Tree:每個節點的值變為原樹中所有大於等於該節點值的節點值之和。
解題思路:
- 反向中序遍歷:BST 的中序遍歷是升序。反向中序遍歷(右 → 根 → 左)就是降序。
- 維護一個累加變數 sum。按「右 → 根 → 左」的順序遍歷,每到一個節點就把 sum 加上該節點值,然後更新節點值為 sum。
- 這樣每個節點的新值就是所有 >= 原始值的節點的總和。
- 這和 LeetCode 538 (Convert BST to Greater Tree) 是完全相同的問題。
C++ 解法
複雜度分析
時間複雜度:O(n) — 每個節點恰好訪問一次
空間複雜度:O(h) — h 為樹高,遞迴堆疊深度
虛擬碼
1. Initialize cumulative sum = 0 2. Reverse in-order traversal (right -> root -> left): a. Recursively process right subtree b. Add current node's value to sum c. Set current node's value = sum d. Recursively process left subtree 3. Return root
其他解法
-
迭代 + 棧:用棧模擬反向中序遍歷。先一路往右走到底,然後處理節點並轉向左子樹。避免遞迴,適合擔心棧溢出的情況。
-
Morris 遍歷:使用 Morris 反向中序遍歷,通過線索化實現 O(1) 額外空間。不需要遞迴棧或顯式棧,但會暫時修改樹的結構(遍歷完後恢復)。
延伸思考
- 如果樹不是 BST 而是普通二元樹,如何把每個節點的值改為所有大於它的節點值之和?
- 能否在 O(1) 額外空間(不含遞迴棧)內完成轉換?
- 這個問題與 LeetCode 538 有什麼關係?