Skip to content

Commit c1ff60a

Browse files
authored
Update Recover a Tree From Preorder Traversal.java
1 parent 50b0cb2 commit c1ff60a

File tree

1 file changed

+30
-26
lines changed

1 file changed

+30
-26
lines changed

Hard/Recover a Tree From Preorder Traversal.java

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,45 @@
44
* int val;
55
* TreeNode left;
66
* TreeNode right;
7-
* TreeNode(int x) { val = x; }
7+
* TreeNode() {}
8+
* TreeNode(int val) { this.val = val; }
9+
* TreeNode(int val, TreeNode left, TreeNode right) {
10+
* this.val = val;
11+
* this.left = left;
12+
* this.right = right;
13+
* }
814
* }
915
*/
1016
class Solution {
11-
public TreeNode recoverFromPreorder(String S) {
12-
Map<Integer, TreeNode> map = new HashMap<>();
17+
public TreeNode recoverFromPreorder(String traversal) {
18+
Stack<TreeNode> stack = new Stack<>();
1319
int idx = 0;
14-
int n = S.length();
15-
16-
while (idx < n) {
17-
int level = 0;
18-
StringBuilder sb = new StringBuilder();
19-
20-
while (idx < n && S.charAt(idx) == '-') {
21-
level++;
20+
while (idx < traversal.length()) {
21+
int depth = 0;
22+
while (idx < traversal.length() && traversal.charAt(idx) == '-') {
23+
depth++;
2224
idx++;
2325
}
24-
25-
while (idx < n && Character.isDigit(S.charAt(idx))) {
26-
sb.append(S.charAt(idx++));
26+
int value = 0;
27+
while (idx < traversal.length() && Character.isDigit(traversal.charAt(idx))) {
28+
value = value * 10 + Character.getNumericValue(traversal.charAt(idx++));
2729
}
28-
29-
TreeNode currNode = new TreeNode(Integer.parseInt(sb.toString()));
30-
map.put(level, currNode);
31-
if (level > 0) {
32-
TreeNode parent = map.get(level - 1);
33-
if (parent.left == null) {
34-
parent.left = currNode;
35-
}
36-
else {
37-
parent.right = currNode;
30+
TreeNode node = new TreeNode(value);
31+
while (stack.size() > depth) {
32+
stack.pop();
33+
}
34+
if (!stack.isEmpty()) {
35+
if (stack.peek().left == null) {
36+
stack.peek().left = node;
37+
} else {
38+
stack.peek().right = node;
3839
}
3940
}
41+
stack.push(node);
42+
}
43+
while (stack.size() > 1) {
44+
stack.pop();
4045
}
41-
42-
return map.get(0);
46+
return stack.peek();
4347
}
4448
}

0 commit comments

Comments
 (0)