题目描述
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 二叉搜索树:
5
/ \
2 13
输出: 转换为累加树:
18
/ \
20 13
算法思路
二叉树果然天然适合递归。并且找到思路以后递归的书写就很简单。
再次重申一句,二叉搜索树的中序遍历即是递增数组。
所以很容易想到反向的中序遍历,就可以从大到小遍历一遍树。
NAIVE
class Solution:
SUM=0
def convertBST(self, root: TreeNode) -> TreeNode:
def BST(root):
if not root:return
self.convertBST(root.right)
tmp=root.val
root.val+=self.SUM
self.SUM+=tmp
self.convertBST(root.left)
BST(root)
return root
这里要提的是,其实满侥幸的,题目没有明确要求二叉搜索树没有重复值,如果有重复值,算法就是不完全的。
IMPROVE
来一点小优化。
class Solution:
SUM=0
def convertBST(self, root: TreeNode) -> TreeNode:
if not root:return
self.convertBST(root.right)
root.val+=self.SUM
self.SUM=root.val
self.convertBST(root.left)
return root
1、去掉了内嵌函数。本来添加内嵌函数是因为我傻泠 了,(其实还是因为递归原理不熟练),想着要返回根节点,于是把递归调用放在了内嵌函数里完成。写完了才想到貌似在每一层最后返回root即可,最后栈回溯最后一层就是根节点。
2、用类属性SUM来保存累加和,多余增加了一个tmp变量,看评论区才注意到其实每个节点的值就是当前的累加和。