问题描述
问题链接:https://leetcode.com/problems/convert-bst-to-greater-tree/#/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
我的代码
一开始的时候没反应过来什么是BST,后来观察了一下,想起来了。于是就很自然的想到先用先序遍历把树转成数组,就得到了一个从小到大排序的数组,然后从后往前累加就可以了。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
List<TreeNode> treeList = new ArrayList<TreeNode>();
public TreeNode convertBST(TreeNode root) {
/*
思路:采取先序遍历的方式,把所有节点加入到列表中,然后从后面起依次向前加即可
*/
if(root == null || root.left == null && root.right == null){
return root;
}
goThrough(root);
int len = treeList.size();
int sum = treeList.get(len - 1).val; // 保存所有比当前节点大(即list中排在当前节点之后的元素)的和
for(int i = len - 2; i >= 0; i--){
int val = treeList.get(i).val;
treeList.get(i).val += sum;
sum += val;
}
return root;
}
private void goThrough(TreeNode root){
if(root.left != null){
goThrough(root.left);
}
treeList.add(root);
if(root.right != null){
goThrough(root.right);
}
}
}
竟然看不到打败了多少代码,差评!
讨论区
Java Recursive O(n) time
链接地址:https://discuss.leetcode.com/topic/83455/java-recursive-o-n-time
这个好聪明啊,直接后序遍历好了。
Since this is a BST, we can do a reverse inorder traversal to traverse the nodes of the tree in descending order. In the process, we keep track of the running sum of all nodes which we have traversed thus far.
public 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);
}
}