https://github.com/September26/java-algorithms
给定一个二叉搜索树 root
(BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。
提醒一下, 二叉搜索树 满足下列约束条件:
示例 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]
提示:
[1, 100]
范围内。0 <= Node.val <= 100
注意:该题目与 538: https://leetcode-cn.com/problems/convert-bst-to-greater-tree/ 相同
本题适用递归的解决方案。
一个节点的值,可以从三方面构成,
1.父节点传入的大于当前节点的值的和;
2.当前节点的值;
3.当前节点右子节点的和。
所以我们构建一个递归方法,传入值为大于该节点的值之和,返回值为当前节点所有的节点值之和。每次遍历的时候,首先求右节点值之和,当前节点值则可以计算得出。
class Solution {
public TreeNode bstToGst(TreeNode root) {
search(root, 0);
return root;
}
int search(TreeNode node, int parentValue) {
if (node == null) {
return 0;
}
int rightValue = search(node.right, parentValue);
int sum = rightValue + node.val;
node.val = node.val + parentValue + rightValue;
int leftValue = search(node.left, node.val);
// 返回的是当前节点的所有节点之和
sum += leftValue;
return sum;
}
}