LeetCode538 把二叉搜尋樹轉為累加樹
阿新 • • 發佈:2021-12-13
題目
給出二叉 搜尋 樹的根節點,該樹的節點值各不相同,請你將其轉換為累加樹(Greater Sum Tree),使每個節點 node的新值等於原樹中大於或等於node.val的值之和。
提醒一下,二叉搜尋樹滿足下列約束條件:
節點的左子樹僅包含鍵 小於 節點鍵的節點。
節點的右子樹僅包含鍵 大於 節點鍵的節點。
左右子樹也必須是二叉搜尋樹。
注意:本題和 1038:https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同
示例 1: 輸入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8] 輸出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8] 示例 2: 輸入:root = [0,null,1] 輸出:[1,null,1] 示例 3: 輸入:root = [1,0,2] 輸出:[3,3,2] 示例 4: 輸入:root = [3,2,4,1] 輸出:[7,9,4,10] 提示: 樹中的節點數介於 0和 104之間。 每個節點的值介於 -104和104之間。 樹中的所有值 互不相同 。 給定的樹為二叉搜尋樹。
方法
遞迴法
- 時間複雜度:O(n),其中 n是二叉搜尋樹的節點數。每一個節點恰好被遍歷一次。
- 空間複雜度:O(n)
class Solution { private int sum = 0; public TreeNode convertBST(TreeNode root) { if(root!=null){ convertBST(root.right); root.val = root.val+sum; sum = root.val; convertBST(root.left); } return root; } }
Morris 遍歷
- 時間複雜度:O(n),其中 n是二叉搜尋樹的節點數。每一個節點恰好被遍歷一次。
- 空間複雜度:O(1)