题目来源:力扣
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
提醒一下,二叉搜索树满足下列约束条件:
节点的左子树仅包含键 小于 节点键的节点。
节点的右子树仅包含键 大于 节点键的节点。
左右子树也必须是二叉搜索树。

图1. 示例
分析:
从最大的开始,那么按照遍历顺序为右中左,即为最大。那么改造原来的中序遍历,并按照右—中—左的顺序遍历。且对于每个节点来说,累计思路都是一样的,因此算法为递归结构。要注意的是,每次遍历右之后,返回一个累计值,以便中间节点+值,再返回累计值,以便左节点+值。
2. 代码
代码实现如下,
- # Definition for a binary tree node.
- class TreeNode(object):
- def __init__(self, val=0, left=None, right=None):
- self.val = val
- self.left = left
- self.right = right
-
- def set_left(self, left):
- self.left = left
-
- def set_right(self, right):
- self.right = right
-
- class Solution(object):
- def subConvertBST(self, root, pre):
- if root != None:
- self.subConvertBST(root.right, pre)
- root.val += pre[0]
- pre[0] = root.val
- self.subConvertBST(root.left, pre)
- return
-
- def convertBST(self, root):
- """
- :type root: TreeNode
- :rtype: TreeNode
- """
- pre = [0]
- self.subConvertBST(root, pre)
- return root
-
- if __name__ == '__main__':
- sol = Solution()
- # 将搜索二叉树转化为累积二叉树
- node1 = TreeNode(10)
- node2 = TreeNode(5)
- node3 = TreeNode(15)
- node4 = TreeNode(1)
- node5 = TreeNode(20)
-
- node1.left = node2
- node1.right = node3
- node3.right = node5
-
- print(sol.preorderTraversal(node1))
- r = sol.convertBST(node1)
- path = sol.preorderTraversal(r)
- print(path)