给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 原始二叉搜索树:
5
/ \
2 13
输出: 转换为累加树:
18
/ \
20 13
解法:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def convertBST(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
if root == None:
return root
prevSum = self.convertTree(root.right, 0)
root.val += prevSum
self.convertTree(root.left, root.val)
return root
def convertTree(self, root, prevSum):
if not root:
return prevSum
root.val += self.convertTree(root.right, prevSum)
prevSum = self.convertTree(root.left, root.val)
return prevSum
由于这是一个二叉搜索树,而且题目要求每个节点的值变为原来的值加上所有大于它的节点值之和,我们就可以利用到二叉树的性质,对于二叉树的任意一个节点,比这个节点值大的节点都在右边,比这个节点值小的节点都在左边。所以我们要获得该节点的新值,只要去遍历它的右子节点就好了。对于这种问题我们通常用递归的思想思考问题,因为对于每一个节点来说它们的操作都是相同的。我们先遍历右子节点,然后根节点,最后左子节点。把右子节点放入函数进行递归可以得到比该节点值大的所有节点和,本节点的更新值即为原值+prevSum,最后将更新后的累加和再传入左子节点进行递归。