题目
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 二叉搜索树:
5
/ \
2 13
输出: 转换为累加树:
18
/ \
20 13
分析
因为是二叉搜索树,所以可以使用中序遍历得到排好序的结果,然后再次遍历修改节点的值,但是效率很低
代码
/**
* 土鳖做法
* @param root
* @return
*/
public TreeNode convertBST(TreeNode root) {
//先中序遍历,得到一个顺序的列表
List<Integer> result = new ArrayList<>();
inOrder(root,result);
//然后重新遍历并赋值
preOrderAndReset(root,result);
return root;
}
private void inOrder(TreeNode node, List<Integer> result) {
if(node == null){
return;
}
inOrder(node.left,result);
result.add(node.val);
inOrder(node.right,result);
}
private void preOrderAndReset(TreeNode node,List<Integer> result){
if(node == null){
return;
}
int index = result.indexOf(node.val);
for (int i = index+1; i < result.size(); i++) {
node.val = node.val+result.get(i);
}
preOrderAndReset(node.left,result);
preOrderAndReset(node.right,result);
}