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

输入:[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]
示例 2:
输入:root = [0,null,1] 输出:[1,null,1]
示例 3:
输入:root = [1,0,2] 输出:[3,3,2]
示例 4:
输入:root = [3,2,4,1] 输出:[7,9,4,10]
提示:
- 树中的节点数介于
0
和10
4
之间。
- 每个节点的值介于
10
4
和10
4
之间。
- 树中的所有值 互不相同 。
- 给定的树为二叉搜索树。
法1 递归
思路
观察原始二叉搜索树和累加之后的二叉搜索树,可以发现。累加树的每一个节点,从最大值节点开始,每个节点值均等于当前节点值+上一个节点值。
因为是从最大节点值开始的,所以遍历的时候从最大值开始,那么就是右中左这样的中序遍历

题解
# 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 __init__(self): # 用来记录上一个节点值,初始为0 self.lastVal = 0 def convertBST(self, root: TreeNode) -> TreeNode: self.traveral(node=root) return root def traveral(self, node): if node is None: return None # 右 self.traveral(node.right) # 中:更新当前节点值 和 上一个节点值 node.val += self.lastVal self.lastVal = node.val # 左 self.traveral(node.left) ##### 还可以 不用 全局变量的写法,但是需要保证参数是可变对象 class Solution: def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]: self.helper(root=root, prev=[0]) return root def helper(self, root, prev): if root is None: return self.helper(root.right, prev) root.val += prev[0] prev[0] = root.val self.helper(root.left, prev)
法2 迭代法
思路
同递归思路,采用中序遍历 右中左 的方法.
程序框架为标准迭代中序遍历框架
题解
# 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: TreeNode) -> TreeNode: if root is None: return None pre = 0 stack = [] cur = root while len(stack)>0 or cur: if cur: stack.append(cur) cur = cur.right else: cur = stack.pop() cur.val += pre pre = cur.val # 转向左子树 cur = cur.left return root