leetcode —— 1038. 從二叉搜索樹到更大和樹

給出二叉 搜索 樹的根節點,該二叉樹的節點值各不相同,修改二叉樹,使每個節點 node 的新值等於原樹中大於或等於 node.val 的值之和。

提醒一下,二叉搜索樹滿足下列約束條件:

節點的左子樹僅包含鍵 小於 節點鍵的節點。
節點的右子樹僅包含鍵 大於 節點鍵的節點。
左右子樹也必須是二叉搜索樹。

示例:
在這裏插入圖片描述

輸入:[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]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
————————————
解題思路:使用二叉搜索樹的性質,使用中序遍歷可以得到有序的從小到大排序的數組。這裏使用反向中序遍歷,遍歷順序有右子節點-根節點-左子節點,這樣得到的反向中序遍歷數組的順序爲從大到小排序的。

定義一個變量保存遍歷到當前節點時,前n個結點的和,也就是保存了反向中序遍歷中最大的前n個值的和。

當前節點的值加上前n個結點的值就是當前節點的更新值,其Python代碼如下:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def __init__(self):
        self.ans = 0  # 維護一個變量,用於保存反向中序遍歷的前n個節點值之和
    def bstToGst(self, root: TreeNode) -> TreeNode:
        
        def sorts(root): # 反向中序遍歷,先遍歷右子節點
            if not root:
                return
            sorts(root.right)
            root.val += self.ans  # 當前節點值更新爲前n個節點之和+當前節點值
            self.ans = root.val  # 變量值更新
            sorts(root.left)
            
        sorts(root)
        return root

時間複雜度爲O(N),空間複雜度爲O(H),H爲樹的高度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章