1. 问题描述:
给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。提醒一下,二叉搜索树满足下列约束条件:
- 节点的左子树仅包含键小于节点键的节点。
- 节点的右子树仅包含键大于节点键的节点。
左右子树也必须是二叉搜索树。
注意:该题目与 538: https://leetcode-cn.com/problems/convert-bst-to-greater-tree/ 相同
示例 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]
提示:
树中的节点数介于 1 和 100 之间。
每个节点的值介于 0 和 100 之间。
树中的所有值互不相同 。
给定的树为二叉搜索树。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree
2. 思路分析:
分析题目可以知道对于当前值为x的节点,我们需要将树中所有值大于等于x的节点的值累加到当前的节点上,并且对于二叉搜索树有一个性质:中序遍历是有序的,相当于我们已知一维的有序数组。我们可以先考虑一维有序数组的情况,如何将当前位置后面的值累加到当前位置上,其实很好处理我们只需要逆序遍历维护一个后缀和即可,在逆序遍历的时候将后缀和累加到当前位置即可,对于二叉搜索树也是类似的,我们可以反向中序遍历,也即先遍历右子树,再遍历左子树,维护一个后缀和累加到当前的节点即可,其实对于二叉搜索树的相关题目,我们都可以看成是已知一个一维的有序数组的情况。
3. 代码如下:
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
# s为后缀和
s = 0
def dfs(self, root: TreeNode):
if not root: return
self.dfs(root.right)
x = root.val
root.val += self.s
self.s += x
self.dfs(root.left)
def convertBST(self, root: TreeNode) -> TreeNode:
self.dfs(root)
return root