1. 程式人生 > 其它 >LeetCode538 把二叉搜尋樹轉為累加樹

LeetCode538 把二叉搜尋樹轉為累加樹

題目

給出二叉 搜尋 樹的根節點,該樹的節點值各不相同,請你將其轉換為累加樹(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)