From d565edc69abbd5ac44e80cabed36f7d4f2a158d5 Mon Sep 17 00:00:00 2001 From: Albina Gimaletdinova Date: Fri, 17 Feb 2023 14:34:44 +0300 Subject: [PATCH] Added recursive&iterative preorder binary tree traversal (#3884) Added recursive& iterative preorder binary tree traversal --- .../trees/PreOrderTraversal.java | 59 +++++++++++++++++++ .../trees/PreOrderTraversalTest.java | 49 +++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 src/main/java/com/thealgorithms/datastructures/trees/PreOrderTraversal.java create mode 100644 src/test/java/com/thealgorithms/datastructures/trees/PreOrderTraversalTest.java diff --git a/src/main/java/com/thealgorithms/datastructures/trees/PreOrderTraversal.java b/src/main/java/com/thealgorithms/datastructures/trees/PreOrderTraversal.java new file mode 100644 index 00000000..d0a5bc4a --- /dev/null +++ b/src/main/java/com/thealgorithms/datastructures/trees/PreOrderTraversal.java @@ -0,0 +1,59 @@ +package com.thealgorithms.datastructures.trees; + +import java.util.ArrayList; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; + +/** + * Given tree is traversed in a 'pre-order' way: ROOT -> LEFT -> 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 17/02/2023 + */ +public class PreOrderTraversal { + public static List recursivePreOrder(BinaryTree.Node root) { + List result = new ArrayList<>(); + recursivePreOrder(root, result); + return result; + } + + public static List iterativePreOrder(BinaryTree.Node root) { + List result = new ArrayList<>(); + if (root == null) return result; + + Deque stack = new LinkedList<>(); + stack.push(root); + while (!stack.isEmpty()) { + BinaryTree.Node node = stack.pop(); + result.add(node.data); + if (node.right != null) stack.push(node.right); + if (node.left != null) stack.push(node.left); + } + + return result; + } + + private static void recursivePreOrder(BinaryTree.Node root, List result) { + if (root == null) { + return; + } + result.add(root.data); + recursivePreOrder(root.left, result); + recursivePreOrder(root.right, result); + } +} diff --git a/src/test/java/com/thealgorithms/datastructures/trees/PreOrderTraversalTest.java b/src/test/java/com/thealgorithms/datastructures/trees/PreOrderTraversalTest.java new file mode 100644 index 00000000..eeac2131 --- /dev/null +++ b/src/test/java/com/thealgorithms/datastructures/trees/PreOrderTraversalTest.java @@ -0,0 +1,49 @@ +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 17/02/2023 + */ +public class PreOrderTraversalTest { + @Test + public void testNullRoot() { + assertEquals(Collections.emptyList(), PreOrderTraversal.recursivePreOrder(null)); + assertEquals(Collections.emptyList(), PreOrderTraversal.iterativePreOrder(null)); + } + + /* + 1 + / \ + 2 3 + /\ /\ + 4 5 6 7 + */ + @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)); + } + + /* + 5 + \ + 6 + \ + 7 + \ + 8 + */ + @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)); + } +}