Description
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
问题描述
给定二叉排序树, 转换该二叉排序树, 使得其每个节点的值为大于它的值的节点值之和
问题分析
“传统的”中序遍历, 获取的二叉排序树的递增值序列, 那么我们不妨转换下思想, 将遍历左右子树的顺序颠倒, 使得遍历的值为由大到小排列, 通过sum累计值, 将其赋值给遍历的当前节点即可
注意一下, 对于二叉排序树来说, 中序遍历通常比较重要(递增值序列), 一般遇到问题可以优先考虑
解法1
/*
这种解法不太优雅
首先通过"传统的"中序遍历获取递增值序列, 将该序列存储在一个List中, 然后逆序累加
*/
class Solution {
private int index;
private List<Integer> res;
public TreeNode convertBST(TreeNode root) {
index = 0;
res = new ArrayList<Integer>();
TreeNode node = root;
inorder(node);
int sum = 0;
for(int i = res.size() - 1;i >= 0;i--){
sum += res.get(i);
res.set(i,sum);
}
node = root;
convert(node);
return root;
}
public void convert(TreeNode root){
if(root == null) return;
convert(root.left);
root.val = res.get(index++);
convert(root.right);
}
public void inorder(TreeNode root){
if(root == null) return;
inorder(root.left);
res.add(root.val);
inorder(root.right);
}
}
解法2
//这种解法就是问题分析中的解法
class Solution {
int sum = 0;
public TreeNode convertBST(TreeNode root) {
convert(root);
return root;
}
public void convert(TreeNode cur) {
if (cur == null) return;
convert(cur.right);
cur.val += sum;
sum = cur.val;
convert(cur.left);
}
}