Skip to content

Commit 8754490

Browse files
1028_Recover_a_Tree_from_Preorder_Traversal.java
1 parent 154db4f commit 8754490

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
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+
* }
14+
* }
15+
*/
16+
class TreeNode {
17+
int val;
18+
TreeNode left, right;
19+
TreeNode(int x) {
20+
val = x;
21+
left = null;
22+
right = null;
23+
}
24+
}
25+
26+
class Solution {
27+
public TreeNode recoverFromPreorder(String traversal) {
28+
Stack<TreeNode> stack = new Stack<>();
29+
int i = 0, n = traversal.length();
30+
31+
while (i < n) {
32+
int depth = 0;
33+
34+
// Count dashes to determine depth
35+
while (i < n && traversal.charAt(i) == '-') {
36+
depth++;
37+
i++;
38+
}
39+
40+
// Read the number (node value)
41+
int numStart = i;
42+
while (i < n && Character.isDigit(traversal.charAt(i))) {
43+
i++;
44+
}
45+
int value = Integer.parseInt(traversal.substring(numStart, i));
46+
47+
TreeNode node = new TreeNode(value);
48+
49+
// If stack size > depth, pop until stack has correct depth parent
50+
while (stack.size() > depth) {
51+
stack.pop();
52+
}
53+
54+
// Attach to parent if exists
55+
if (!stack.isEmpty()) {
56+
TreeNode parent = stack.peek();
57+
if (parent.left == null) {
58+
parent.left = node;
59+
} else {
60+
parent.right = node;
61+
}
62+
}
63+
64+
// Push current node to stack
65+
stack.push(node);
66+
}
67+
68+
// Root node is the first node in stack
69+
while (stack.size() > 1) {
70+
stack.pop();
71+
}
72+
return stack.peek();
73+
}
74+
75+
// Helper function to print tree in preorder
76+
public static void preorder(TreeNode root) {
77+
if (root == null) return;
78+
System.out.print(root.val + " ");
79+
preorder(root.left);
80+
preorder(root.right);
81+
}
82+
83+
public static void main(String[] args) {
84+
Solution sol = new Solution();
85+
String traversal = "1-2--3--4-5--6--7";
86+
TreeNode root = sol.recoverFromPreorder(traversal);
87+
88+
System.out.println("Preorder Traversal of Recovered Tree:");
89+
preorder(root);
90+
}
91+
}

0 commit comments

Comments
 (0)