版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tc_To_Top/article/details/89431729
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
题目链接:https://leetcode.com/problems/convert-bst-to-greater-tree/
题目分析:
法一:最直接的方法,两次中序,第一次求后缀和,第二次赋值
9ms,时间击败15.57%,直接DFS 2ms,时间击败76.34%
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode convertBST(TreeNode root) {
if (root == null || (root.left == null && root.right == null)) {
return root;
}
TreeNode ans = root;
List<Integer> values = new ArrayList<>();
Stack<TreeNode> stk = new Stack<>();
while (root != null || !stk.empty()) {
while (root != null) {
stk.push(root);
root = root.left;
}
if (!stk.empty()) {
root = stk.peek();
stk.pop();
values.add(root.val);
root = root.right;
}
}
int n = values.size();
int[] suffixSum = new int[n];
suffixSum[n - 1] = values.get(n - 1);
for (int i = n - 2; i >= 0; i--) {
suffixSum[i] = values.get(i) + suffixSum[i + 1];
}
stk.clear();
int pos = 0;
root = ans;
while (root != null || !stk.empty()) {
while (root != null) {
stk.push(root);
root = root.left;
}
if (!stk.empty()) {
root = stk.peek();
stk.pop();
root.val = suffixSum[pos++];
root = root.right;
}
}
return ans;
}
}
法二:按右中左的顺序做中序,直接累加结点值即可
0ms,时间击败100%
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int suffixSum = 0;
public void DFS(TreeNode root) {
if (root == null) {
return;
}
DFS(root.right);
suffixSum += root.val;
root.val = suffixSum;
DFS(root.left);
}
public TreeNode convertBST(TreeNode root) {
if (root == null || (root.left == null && root.right == null)) {
return root;
}
DFS(root);
return root;
}
}