Skip to content

Commit 602a510

Browse files
committed
Added tree traversal with out recursion
1 parent 95f8229 commit 602a510

File tree

1 file changed

+109
-8
lines changed

1 file changed

+109
-8
lines changed

src/main/java/com/eprogrammerz/examples/algorithm/trees/TreeTraversal.java

Lines changed: 109 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ public class TreeTraversal {
1414
private BinaryTree tree;
1515

1616
/**
17-
* 1
18-
* / \
19-
* 2 3
20-
* / \ \
21-
* 4 5 6
17+
* 1
18+
* / \
19+
* 2 3
20+
* / \ \
21+
* 4 5 6
22+
*
23+
*
24+
* postorder: 1 2 4 5 3 6
2225
*/
2326

2427
@Before
@@ -52,31 +55,56 @@ public void testInOrderTraversal() {
5255
assertEquals(expected.toString(), traversal.toString());
5356
}
5457

58+
@Test
59+
public void testInOrderTraversalRecursive() {
60+
List<Integer> expected = Arrays.asList(4, 2, 5, 1, 3, 6);
61+
List<Integer> actual = tree.inOrderTraversalRecursive(tree.root);
62+
63+
assertEquals(expected, actual);
64+
}
65+
5566
@Test
5667
public void testPreOrderTraversal() {
5768
List<Node> traversal = new ArrayList<>();
5869
tree.preOrderTraversal(tree.root, traversal);
5970

6071
List<Node> expected = Arrays.asList(new Node(1),
61-
new Node(2), new Node(4),new Node(5),new Node(3), new Node(6));
72+
new Node(2), new Node(4), new Node(5), new Node(3), new Node(6));
6273

6374
assertEquals(expected.toString(), traversal.toString());
6475
}
6576

77+
@Test
78+
public void testPreOrderTraversalRecursive() {
79+
List<Integer> expected = Arrays.asList(1, 2, 4, 5, 3, 6);
80+
List<Integer> actual = tree.preOrderRecursive(tree.root);
81+
82+
assertEquals(expected, actual);
83+
}
84+
6685
@Test
6786
public void testPostOrderTraversal() {
6887
List<Node> traversal = new ArrayList<>();
6988
tree.postOrderTraversal(tree.root, traversal);
7089

7190
List<Node> expected = Arrays.asList(
72-
new Node(4),new Node(5),new Node(2), new Node(6), new Node(3), new Node(1) );
91+
new Node(4), new Node(5), new Node(2), new Node(6), new Node(3), new Node(1));
7392

7493
assertEquals(expected.toString(), traversal.toString());
7594
}
7695

96+
@Test
97+
public void testPostOrderRecursive() {
98+
List<Integer> traversal = tree.postOrderRecursive(tree.root);
99+
100+
List<Integer> expected = Arrays.asList(4, 5, 2, 6, 3, 1);
101+
102+
assertEquals(expected, traversal);
103+
}
104+
77105
@Test
78106
public void testGetLevelWidths() {
79-
List<Integer> widths = Arrays.asList(1,2,3);
107+
List<Integer> widths = Arrays.asList(1, 2, 3);
80108
assertEquals(widths, tree.getLevelWidth());
81109
}
82110
}
@@ -125,6 +153,31 @@ void inOrderTraversal(Node node, List<Node> traversal) {
125153
if (node.right != null) inOrderTraversal(node.right, traversal);
126154
}
127155

156+
/**
157+
* Recursive version of in order tree traversal
158+
*
159+
* @param root
160+
* @return
161+
*/
162+
List<Integer> inOrderTraversalRecursive(Node root) {
163+
List<Integer> traversal = new ArrayList<>();
164+
165+
Stack<Node> stack = new Stack<>();
166+
167+
Node curr = root;
168+
169+
while (curr != null || !stack.isEmpty()) {
170+
while (curr != null) {
171+
stack.push(curr);
172+
curr = curr.left;
173+
}
174+
curr = stack.pop();
175+
traversal.add(curr.data);
176+
curr = curr.right;
177+
}
178+
return traversal;
179+
}
180+
128181
/**
129182
* 1. Visit node
130183
* 2. go to left
@@ -141,6 +194,27 @@ void preOrderTraversal(Node node, List<Node> traversal) {
141194
if (node.right != null) preOrderTraversal(node.right, traversal);
142195
}
143196

197+
List<Integer> preOrderRecursive(Node node) {
198+
List<Integer> traversal = new ArrayList<>();
199+
if (node == null) return traversal;
200+
201+
Stack<Node> stack = new Stack<>();
202+
203+
Node curr = node;
204+
205+
while (curr != null || !stack.isEmpty()) {
206+
if (curr != null) {
207+
stack.push(curr);
208+
traversal.add(curr.data);
209+
curr = curr.left;
210+
} else {
211+
curr = stack.pop().right;
212+
}
213+
}
214+
215+
return traversal;
216+
}
217+
144218
/**
145219
* 1. go to left
146220
* 2. go to right
@@ -157,6 +231,33 @@ void postOrderTraversal(Node node, List<Node> traversal) {
157231
traversal.add(node);
158232
}
159233

234+
List<Integer> postOrderRecursive(Node node) {
235+
List<Integer> traversal = new ArrayList<>();
236+
if (node == null) return traversal;
237+
238+
Stack<Node> stack = new Stack<>();
239+
240+
Node lastNode = node;
241+
242+
while (node != null || !stack.isEmpty()) {
243+
244+
if (node != null) {
245+
stack.push(node);
246+
node = node.left;
247+
} else {
248+
Node peek = stack.peek();
249+
250+
if (peek.right != null && lastNode != peek.right) {
251+
node = peek.right;
252+
} else {
253+
traversal.add(peek.data);
254+
lastNode = stack.pop();
255+
}
256+
}
257+
}
258+
return traversal;
259+
}
260+
160261
public List<Integer> getLevelWidth() {
161262
List<Integer> widths = new ArrayList<>();
162263

0 commit comments

Comments
 (0)