538. 把二叉搜索树转换为累加树
题目描述
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 原始二叉搜索树:
5
/
2 13
输出: 转换为累加树:
18
/
20 13
注意:本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同
解法一:回溯(逆中序遍历)
- 用一个sum维护当前遍历的累加数值
- 采用右中左的访问顺序
class Solution {
int sum = 0;
public TreeNode convertBST(TreeNode root) {
if(root!=null){
convertBST(root.right);
root.val+=sum;
sum=root.val;
convertBST(root.left);
}
return root;
}
}
解法二:迭代
- 当前节点的最右节点都压入栈中
- 再访问栈顶节点,并考虑左子树
class Solution {
public TreeNode convertBST(TreeNode root) {
int sum = 0;
TreeNode node = root;
Stack<TreeNode> stack = new Stack<>();
while(!stack.isEmpty()||node!=null){
while(node!=null){
stack.push(node);
node=node.right;
}
node =stack.pop();
node.val+=sum;
sum=node.val;
node=node.left;
}
return root;
}
}