@@ -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