Given the root of a binary search tree with distinct values, modify it so that every node has a new value equal to the sum of the values of the original tree that are greater than or equal to node.val.
As a reminder, a binary search tree is a tree that satisfies these constraints:
The left subtree of a node contains only nodes with keys less than the node's key.
The right subtree of a node contains only nodes with keys greater than the node's key.
Both the left and right subtrees must also be binary search trees.
Example 1:
Input: [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
Output: [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
Constraints:
The number of nodes in the tree is between 1 and 100.
Each node will have value between 0 and 100.
The given tree is a binary search tree.
Note: This question is the same as 538: https://leetcode.com/problems/convert-bst-to-greater-tree/
hint1:What traversal method organizes all nodes in sorted order?
每个节点赋予新值,所有比它大的节点的值的和。
answer one
int pre = 0;
public TreeNode bstToGst(TreeNode root) {
if (root.right != null) bstToGst(root.right);
pre = root.val = pre + root.val;
if (root.left != null) bstToGst(root.left);
return root;
}
answer tow
// Iterative
class Solution {
public TreeNode bstToGst (TreeNode root) {
int sum = 0;
TreeNode cur = root;
Deque<TreeNode> stack = new ArrayDeque<>();
while (!stack.isEmpty() || cur != null) {
while (cur != null) {
stack.push(cur);
cur = cur.right;
}
cur = stack.pop();
cur.val += sum;
sum = cur.val;
cur = cur.left;
}
return root;
}
}
// recursive
class Solution {
public TreeNode bstToGst (TreeNode root) {
bstToGstHelper(root, 0);
return root;
}
private int bstToGstHelper (TreeNode root, int s) {
if (root == null) {
return 0;
}
int sum = root.val + bstToGstHelper(root.right, s);
root.val = sum + s;
sum += bstToGstHelper(root.left, root.val);
return sum;
}
}