目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
描述:
给定一个二叉搜索树 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;
}
}