Skip to content

Commit 9f71db4

Browse files
edit 538
1 parent 98c8ebf commit 9f71db4

File tree

3 files changed

+59
-39
lines changed

3 files changed

+59
-39
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ Your ideas/fixes/algorithms are more than welcome!
101101
|541|[Reverse String II](https://leetcode.com/problems/reverse-string-ii/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_541.java) | O(n) |O(1) | Easy | String
102102
|540|[Single Element in a Sorted Array](https://leetcode.com/problems/single-element-in-a-sorted-array/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_540.java) | O(n) |O(1) | Medium |
103103
|539|[Minimum Time Difference](https://leetcode.com/problems/minimum-time-difference/)|[Solution](../master/src/main/java/com/fishercoder/solutions/MinimumTimeDifference.java) | O(n) |O(1) | Medium | String
104-
|538|[Convert BST to Greater Tree](https://leetcode.com/problems/convert-bst-to-greater-tree/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_538.java) | O(nlogn) |O(n) | Medium | Tree
104+
|538|[Convert BST to Greater Tree](https://leetcode.com/problems/convert-bst-to-greater-tree/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_538.java) | O(n) |O(h) | Medium | Tree
105105
|537|[Complex Number Multiplication](https://leetcode.com/problems/complex-number-multiplication/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_537.java) | O(1) |O(1) | Medium | Math, String
106106
|536|[Construct Binary Tree from String](https://leetcode.com/problems/construct-binary-tree-from-string/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_536.java) | O(n) |O(h) | Medium | Recursion
107107
|535|[Encode and Decode TinyURL](https://leetcode.com/problems/encode-and-decode-tinyurl/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_535.java) | O(1) |O(n) | Medium | Design

src/main/java/com/fishercoder/solutions/_538.java

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27,42 +27,62 @@
2727
*/
2828

2929
public class _538 {
30-
//This solution is generic for both BST and regular binary trees
31-
public TreeNode convertBST(TreeNode root) {
32-
if (root == null) return root;
33-
List<Integer> list = new ArrayList<>();
34-
putNodeToList(list, root);
35-
Collections.sort(list);
36-
int[] sums = new int[list.size()];
37-
sums[list.size()-1] = 0;
38-
for (int i = list.size()-2; i >= 0; i--) {
39-
sums[i] = sums[i+1] + list.get(i+1);
30+
31+
public static class BSTSolution {
32+
/**reference: https://discuss.leetcode.com/topic/83455/java-recursive-o-n-time/13
33+
*
34+
* A reversed version of inorder traversal: right -> root -> left*/
35+
public TreeNode convertBST(TreeNode root) {
36+
dfs(root, 0);
37+
return root;
4038
}
41-
TreeMap<Integer, Integer> treeMap = new TreeMap<>();
42-
for (int i = 0; i < list.size(); i++) {
43-
treeMap.put(list.get(i), sums[i]);
39+
40+
private int dfs(TreeNode root, int val) {
41+
if (root == null) return val;
42+
int right = dfs(root.right, val);
43+
root.val += right;
44+
int left = dfs(root.left, root.val);
45+
return left;
4446
}
45-
TreeNode result = new TreeNode(treeMap.get(list.get(0)));
46-
return generateResultRoot(root, treeMap, result);
4747
}
4848

49-
private TreeNode generateResultRoot(TreeNode root, TreeMap<Integer, Integer> treeMap, TreeNode result) {
50-
if (root != null) result.val = treeMap.get(root.val) + root.val;
51-
if (root.left != null) {
52-
result.left = new TreeNode(0);
53-
generateResultRoot(root.left, treeMap, result.left);
49+
public static class GenericSolution {
50+
//This solution is generic for both BST and regular binary trees
51+
public TreeNode convertBST(TreeNode root) {
52+
if (root == null) return root;
53+
List<Integer> list = new ArrayList<>();
54+
putNodeToList(list, root);
55+
Collections.sort(list);
56+
int[] sums = new int[list.size()];
57+
sums[list.size() - 1] = 0;
58+
for (int i = list.size() - 2; i >= 0; i--) {
59+
sums[i] = sums[i + 1] + list.get(i + 1);
60+
}
61+
TreeMap<Integer, Integer> treeMap = new TreeMap<>();
62+
for (int i = 0; i < list.size(); i++) {
63+
treeMap.put(list.get(i), sums[i]);
64+
}
65+
TreeNode result = new TreeNode(treeMap.get(list.get(0)));
66+
return generateResultRoot(root, treeMap, result);
5467
}
55-
if (root.right != null) {
56-
result.right = new TreeNode(0);
57-
generateResultRoot(root.right, treeMap, result.right);
68+
69+
private TreeNode generateResultRoot(TreeNode root, TreeMap<Integer, Integer> treeMap, TreeNode result) {
70+
if (root != null) result.val = treeMap.get(root.val) + root.val;
71+
if (root.left != null) {
72+
result.left = new TreeNode(0);
73+
generateResultRoot(root.left, treeMap, result.left);
74+
}
75+
if (root.right != null) {
76+
result.right = new TreeNode(0);
77+
generateResultRoot(root.right, treeMap, result.right);
78+
}
79+
return result;
5880
}
59-
return result;
60-
}
6181

62-
private void putNodeToList(List<Integer> list, TreeNode root) {
63-
if (root != null) list.add(root.val);
64-
if (root.left != null) putNodeToList(list, root.left);
65-
if (root.right != null) putNodeToList(list, root.right);
82+
private void putNodeToList(List<Integer> list, TreeNode root) {
83+
if (root != null) list.add(root.val);
84+
if (root.left != null) putNodeToList(list, root.left);
85+
if (root.right != null) putNodeToList(list, root.right);
86+
}
6687
}
67-
6888
}

src/test/java/com/fishercoder/_538Test.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@
99
import static junit.framework.Assert.assertEquals;
1010

1111
public class _538Test {
12-
private static _538 test;
12+
private static _538.GenericSolution genericSolution;
13+
private static _538.BSTSolution bstSolution;
1314
private static TreeNode actualRoot;
1415
private static TreeNode expectedRoot;
1516
private static TreeNode root;
1617

1718
@BeforeClass
1819
public static void setup(){
19-
test = new _538();
20+
bstSolution = new _538.BSTSolution();
21+
genericSolution = new _538.GenericSolution();
2022
}
2123

2224
@Before
@@ -28,20 +30,18 @@ public void test1(){
2830
root = new TreeNode(5);
2931
root.left = new TreeNode(2);
3032
root.right = new TreeNode(13);
31-
3233
expectedRoot = new TreeNode(18);
3334
expectedRoot.left = new TreeNode(20);
3435
expectedRoot.right = new TreeNode(13);
35-
actualRoot = test.convertBST(root);
36-
assertEquals(expectedRoot.toString(), actualRoot.toString());
36+
assertEquals(expectedRoot.toString(), genericSolution.convertBST(root).toString());
37+
assertEquals(expectedRoot.toString(), bstSolution.convertBST(root).toString());
3738
}
3839

3940
@Test
4041
public void test2(){
4142
root = null;
42-
4343
expectedRoot = null;
44-
actualRoot = test.convertBST(root);
45-
assertEquals(expectedRoot, actualRoot);
44+
assertEquals(expectedRoot, genericSolution.convertBST(root));
45+
assertEquals(expectedRoot, bstSolution.convertBST(root));
4646
}
4747
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy