Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST.
Example:
Input: The root of a Binary Search Tree like this:
5
/ \
2 13
Output: The root of a Greater Tree like this:
18
/ \
20 13
我一开始的想法是,从右侧树开始进行遍历,对每一个节点都加上父类传下的已知的更大的数和右节点下比当前结点大的数的和 (右孩子的最左孩子),但是比较麻烦
class Solution {
public TreeNode convertBST(TreeNode root) {
if(root == null) return null;
if(root.left == null && root.right == null) return root;
return s(root,0);
}
public TreeNode s(TreeNode root,int maxer){
if(root.right!=null){
root.right = s(root.right,maxer);
TreeNode temp = root.right;
while(temp.left!=null){
temp = temp.left;
}
root.val += temp.val;
}else{
root.val += maxer;
}
if(root.left!=null){
root.left =s(root.left,root.val);
}
return root;
}
}
后来看到更有效率的解法,因为我一直想这将maxer在递归中传递,就忽略了可以采用静态全局变量的方法,
以后遇到类似情况,可以引以为戒,下面基本就是一个简单的从右开始的中序遍历
class Solution {
private int sum = 0;
public TreeNode convertBST(TreeNode root) {
if (root == null) return null;
convertBST(root.right);
root.val += sum;
sum = root.val;
convertBST(root.left);
return root;
}
}