diff --git a/src/main/java/com/thealgorithms/datastructures/trees/InorderTraversal.java b/src/main/java/com/thealgorithms/datastructures/trees/InorderTraversal.java new file mode 100644 index 00000000..64413755 --- /dev/null +++ b/src/main/java/com/thealgorithms/datastructures/trees/InorderTraversal.java @@ -0,0 +1,60 @@ +package com.thealgorithms.datastructures.trees; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; + +/** + * Given tree is traversed in an 'inorder' way: LEFT -> ROOT -> RIGHT. + * Below are given the recursive and iterative implementations. + * + * Complexities: + * Recursive: O(n) - time, O(n) - space, where 'n' is the number of nodes in a tree. + * + * Iterative: O(n) - time, O(h) - space, where 'n' is the number of nodes in a tree + * and 'h' is the height of a binary tree. + * In the worst case 'h' can be O(n) if tree is completely unbalanced, for instance: + * 5 + * \ + * 6 + * \ + * 7 + * \ + * 8 + * + * @author Albina Gimaletdinova on 21/02/2023 + */ +public class InorderTraversal { + public static List recursiveInorder(BinaryTree.Node root) { + List result = new ArrayList<>(); + recursiveInorder(root, result); + return result; + } + + public static List iterativeInorder(BinaryTree.Node root) { + List result = new ArrayList<>(); + if (root == null) return result; + + Deque stack = new ArrayDeque<>(); + while (!stack.isEmpty() || root != null) { + while (root != null) { + stack.push(root); + root = root.left; + } + root = stack.pop(); + result.add(root.data); + root = root.right; + } + return result; + } + + private static void recursiveInorder(BinaryTree.Node root, List result) { + if (root == null) { + return; + } + recursiveInorder(root.left, result); + result.add(root.data); + recursiveInorder(root.right, result); + } +} diff --git a/src/test/java/com/thealgorithms/datastructures/trees/InorderTraversalTest.java b/src/test/java/com/thealgorithms/datastructures/trees/InorderTraversalTest.java new file mode 100644 index 00000000..6b882cae --- /dev/null +++ b/src/test/java/com/thealgorithms/datastructures/trees/InorderTraversalTest.java @@ -0,0 +1,53 @@ +package com.thealgorithms.datastructures.trees; + +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author Albina Gimaletdinova on 21/02/2023 + */ +public class InorderTraversalTest { + @Test + public void testNullRoot() { + assertEquals(Collections.emptyList(), InorderTraversal.recursiveInorder(null)); + assertEquals(Collections.emptyList(), InorderTraversal.iterativeInorder(null)); + } + + /* + 1 + / \ + 2 3 + /\ /\ + 4 5 6 7 + */ + @Test + public void testRecursiveInorder() { + final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{1, 2, 3, 4, 5, 6, 7}); + List expected = List.of(4, 2, 5, 1, 6, 3, 7); + + assertEquals(expected, InorderTraversal.recursiveInorder(root)); + assertEquals(expected, InorderTraversal.iterativeInorder(root)); + } + + /* + 5 + \ + 6 + \ + 7 + \ + 8 + */ + @Test + public void testRecursiveInorderNonBalanced() { + final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{5, null, 6, null, 7, null, 8}); + List expected = List.of(5, 6, 7, 8); + + assertEquals(expected, InorderTraversal.recursiveInorder(root)); + assertEquals(expected, InorderTraversal.iterativeInorder(root)); + } +} diff --git a/src/test/java/com/thealgorithms/datastructures/trees/PreOrderTraversalTest.java b/src/test/java/com/thealgorithms/datastructures/trees/PreOrderTraversalTest.java index eeac2131..6f410697 100644 --- a/src/test/java/com/thealgorithms/datastructures/trees/PreOrderTraversalTest.java +++ b/src/test/java/com/thealgorithms/datastructures/trees/PreOrderTraversalTest.java @@ -27,8 +27,10 @@ public class PreOrderTraversalTest { @Test public void testRecursivePreOrder() { final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{1, 2, 3, 4, 5, 6, 7}); - assertEquals(List.of(1, 2, 4, 5, 3, 6, 7), PreOrderTraversal.recursivePreOrder(root)); - assertEquals(List.of(1, 2, 4, 5, 3, 6, 7), PreOrderTraversal.iterativePreOrder(root)); + List expected = List.of(1, 2, 4, 5, 3, 6, 7); + + assertEquals(expected, PreOrderTraversal.recursivePreOrder(root)); + assertEquals(expected, PreOrderTraversal.iterativePreOrder(root)); } /* @@ -43,7 +45,9 @@ public class PreOrderTraversalTest { @Test public void testRecursivePreOrderNonBalanced() { final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{5, null, 6, null, 7, null, 8}); - assertEquals(List.of(5, 6, 7, 8), PreOrderTraversal.recursivePreOrder(root)); - assertEquals(List.of(5, 6, 7, 8), PreOrderTraversal.iterativePreOrder(root)); + List expected = List.of(5, 6, 7, 8); + + assertEquals(expected, PreOrderTraversal.recursivePreOrder(root)); + assertEquals(expected, PreOrderTraversal.iterativePreOrder(root)); } }