給出二叉 搜索 樹的根節點,該二叉樹的節點值各不相同,修改二叉樹,使每個節點 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爲樹的高度。