From 23503a06737ea6d75c8a7932f31e1dad88580f94 Mon Sep 17 00:00:00 2001 From: kwoyke Date: Wed, 24 Mar 2021 22:09:02 +0100 Subject: [PATCH] BAEL-4864: Fix traverseInOrderWithoutRecursion method (#10588) Co-authored-by: Krzysztof Woyke --- .../java/com/baeldung/tree/BinaryTree.java | 56 +++++++++---------- .../com/baeldung/tree/BinaryTreeUnitTest.java | 27 ++++++++- 2 files changed, 53 insertions(+), 30 deletions(-) diff --git a/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java b/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java index 7469e8ba64..42cacbd3ea 100644 --- a/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java +++ b/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java @@ -148,48 +148,46 @@ public class BinaryTree { } } - public void traverseInOrderWithoutRecursion() { - Stack stack = new Stack(); + Stack stack = new Stack<>(); + Node current = root; + + while (current != null || !stack.isEmpty()) { + while (current != null) { + stack.push(current); + current = current.left; + } + + Node top = stack.pop(); + visit(top.value); + current = top.right; + } + } + + public void traversePreOrderWithoutRecursion() { + Stack stack = new Stack<>(); Node current = root; stack.push(root); - while(! stack.isEmpty()) { - while(current.left != null) { - current = current.left; - stack.push(current); - } + + while (current != null && !stack.isEmpty()) { current = stack.pop(); visit(current.value); - if(current.right != null) { - current = current.right; - stack.push(current); - } + + if (current.right != null) + stack.push(current.right); + + if (current.left != null) + stack.push(current.left); } } - public void traversePreOrderWithoutRecursion() { - Stack stack = new Stack(); - Node current = root; - stack.push(root); - while(! stack.isEmpty()) { - current = stack.pop(); - visit(current.value); - - if(current.right != null) - stack.push(current.right); - - if(current.left != null) - stack.push(current.left); - } - } - public void traversePostOrderWithoutRecursion() { - Stack stack = new Stack(); + Stack stack = new Stack<>(); Node prev = root; Node current = root; stack.push(root); - while (!stack.isEmpty()) { + while (current != null && !stack.isEmpty()) { current = stack.peek(); boolean hasChild = (current.left != null || current.right != null); boolean isPrevLastChild = (prev == current.right || (prev == current.left && current.right == null)); diff --git a/data-structures/src/test/java/com/baeldung/tree/BinaryTreeUnitTest.java b/data-structures/src/test/java/com/baeldung/tree/BinaryTreeUnitTest.java index f99cb52ed7..e89557f21b 100644 --- a/data-structures/src/test/java/com/baeldung/tree/BinaryTreeUnitTest.java +++ b/data-structures/src/test/java/com/baeldung/tree/BinaryTreeUnitTest.java @@ -13,7 +13,7 @@ public class BinaryTreeUnitTest { BinaryTree bt = createBinaryTree(); - assertTrue(!bt.isEmpty()); + assertFalse(bt.isEmpty()); } @Test @@ -72,6 +72,7 @@ public class BinaryTreeUnitTest { @Test public void it_deletes_the_root() { + int value = 12; BinaryTree bt = new BinaryTree(); bt.add(value); @@ -91,6 +92,14 @@ public class BinaryTreeUnitTest { bt.traverseInOrderWithoutRecursion(); } + @Test + public void givenAnEmptyBinaryTree_WhenTraversingInOrderWithoutRecursion_ThenNoException() { + + BinaryTree empty = new BinaryTree(); + + empty.traverseInOrderWithoutRecursion(); + } + @Test public void givenABinaryTree_WhenTraversingPreOrder_ThenPrintValues() { @@ -101,6 +110,14 @@ public class BinaryTreeUnitTest { bt.traversePreOrderWithoutRecursion(); } + @Test + public void givenAnEmptyBinaryTree_WhenTraversingPreOrderWithoutRecursion_ThenNoException() { + + BinaryTree empty = new BinaryTree(); + + empty.traversePreOrderWithoutRecursion(); + } + @Test public void givenABinaryTree_WhenTraversingPostOrder_ThenPrintValues() { @@ -111,6 +128,14 @@ public class BinaryTreeUnitTest { bt.traversePostOrderWithoutRecursion(); } + @Test + public void givenAnEmptyBinaryTree_WhenTraversingPostOrderWithoutRecursion_ThenNoException() { + + BinaryTree empty = new BinaryTree(); + + empty.traversePostOrderWithoutRecursion(); + } + @Test public void givenABinaryTree_WhenTraversingLevelOrder_ThenPrintValues() {