You are given the root of a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus the sum of all keys greater than the original key in BST.
As a reminder, a binary search tree is a tree that satisfies these constraints:
Example 1:
Input: root = [10,9,15,4,null,12,19,2,5,11]
Output: [67,76,34,85,null,46,19,87,81,57]Example 2:
Input: root = [2,1,3]
Output: [5,6,3]Constraints:
0 <= The number of nodes in the tree <= 10,000.-10,000 <= Node.val <= 10,000root is guaranteed to be a valid binary search tree.# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
def getSum(node):
if not node:
return 0
return node.val + getSum(node.left) + getSum(node.right)
totalSum = getSum(root)
def dfs(node):
nonlocal totalSum
if not node:
return
dfs(node.left)
tmp = node.val
node.val = totalSum
totalSum -= tmp
dfs(node.right)
dfs(root)
return root# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
curSum = 0
def dfs(node):
nonlocal curSum
if not node:
return
dfs(node.right)
tmp = node.val
node.val += curSum
curSum += tmp
dfs(node.left)
dfs(root)
return root# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
curSum = 0
stack = []
node = root
while stack or node:
while node:
stack.append(node)
node = node.right
node = stack.pop()
curSum += node.val
node.val = curSum
node = node.left
return root# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
curSum = 0
cur = root
while cur:
if cur.right:
prev = cur.right
while prev.left and prev.left != cur:
prev = prev.left
if not prev.left:
prev.left = cur
cur = cur.right
else:
prev.left = None
curSum += cur.val
cur.val = curSum
cur = cur.left
else:
curSum += cur.val
cur.val = curSum
cur = cur.left
return root