1.题目描述
给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。
提醒一下,二叉搜索树满足下列约束条件:
节点的左子树仅包含键 小于 节点键的节点。
节点的右子树仅包含键 大于 节点键的节点。
左右子树也必须是二叉搜索树。
示例 1:
输入:root = [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]
2.解题思路与代码
2.1 解题思路
这道题给定一个二叉搜索树,要把节点的值改成大于该节点的节点总和加上当前节点值。由于题目给定的是二叉搜索树,因此根绝二叉搜索树的特性,比当前节点大的节点均在当前节点的右子树上,因此我们只需要先得到节点右子树总和,然后将这个和加上当前节点的值便是该节点的新值。那么我们就可以对中序遍历进行改变,先遍历右子树,然后处理当前节点,最后遍历左子树即可。这个时候我们可以注意到,从右子树开始遍历,随着遍历节点的顺序,节点更新后的值将会是一次递增的,因此用一个常量存储当前遍历过节点的总和即可。
2.2 代码
class Solution {
int sum = 0;
public TreeNode convertBST(TreeNode root) {
process(root);
return root;
}
public void process(TreeNode node) {
if (node == null) {
return;
}
process(node.right);
sum += node.val;
node.val = sum;
process(node.left);
}
}
2.3 测试结果
通过测试
3.总结
- 修改中序遍历,先遍历右子树,然后处理当前节点,再遍历左子树
- 使用一个变量存储遍历过的节点总和