538. 把二叉搜索树转换为累加树
难度:中等
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node
的新值等于原树中大于或等于 node.val
的值之和。
提醒一下,二叉搜索树满足下列约束条件:
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
**注意:**本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同
思路
我开始看到这道题也有点懵,想到了要用中序遍历,但是一直没法算,看了一眼官方题解,提到了反向中序遍历,好吧是我固定思维了
如果是正向中序遍历的话,那我们遍历的顺序是从小到大遍历元素
如果是反向中序遍历的话,那我们遍历的顺序就是从大到小的遍历
这时候设置一个变量去统计当前的和,在遍历到一个元素时,将其值加入sum中,然后将sum复制给node.val,然后再去遍历下一个元素
package cn.edu.xjtu.carlWay.tree.BST2GreaterTree;
import cn.edu.xjtu.Util.TreeNode.TreeNode;
/**
* 538. 把二叉搜索树转换为累加树
* 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
* <p>
* 提醒一下,二叉搜索树满足下列约束条件:
* <p>
* 节点的左子树仅包含键 小于 节点键的节点。
* 节点的右子树仅包含键 大于 节点键的节点。
* 左右子树也必须是二叉搜索树。
* 注意:本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同
* <p>
* https://leetcode-cn.com/problems/convert-bst-to-greater-tree/
*/
public class Solution {
int sum = 0;
public TreeNode convertBST(TreeNode root) {
if (root == null) {
return null;
}
convertBST(root.right);
sum += root.val;
root.val = sum;
convertBST(root.left);
return root;
}
}