From 643b72e32b7671f8ffb5ac383ba822f390c6be71 Mon Sep 17 00:00:00 2001 From: Albina Gimaletdinova Date: Wed, 11 Jan 2023 23:31:56 +0300 Subject: [PATCH 1/2] Added Zigzag Traversal of a Binary Tree --- .../datastructures/trees/ZigZagTraversal.java | 70 +++++++++++++++++++ .../trees/ZigzagTraversalTest.java | 30 ++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/main/java/com/thealgorithms/datastructures/trees/ZigZagTraversal.java create mode 100644 src/test/java/com/thealgorithms/datastructures/trees/ZigzagTraversalTest.java diff --git a/src/main/java/com/thealgorithms/datastructures/trees/ZigZagTraversal.java b/src/main/java/com/thealgorithms/datastructures/trees/ZigZagTraversal.java new file mode 100644 index 000000000000..6347fa36ee08 --- /dev/null +++ b/src/main/java/com/thealgorithms/datastructures/trees/ZigZagTraversal.java @@ -0,0 +1,70 @@ +package com.thealgorithms.datastructures.trees; + +import java.util.*; + +/** + * Given a binary tree. + * This code returns the zigzag level order traversal of its nodes' values. + * Binary tree: + * 7 + * / \ + * 6 3 + * / \ / \ + * 2 4 10 19 + * Zigzag traversal: + * [[7], [3, 6], [2, 4, 10, 19]] + *

+ * This solution implements the breadth-first search (BFS) algorithm using a queue. + * 1. The algorithm starts with a root node. This node is added to a queue. + * 2. While the queue is not empty: + * - each time we enter the while-loop we get queue size. Queue size refers to the number of nodes at the current level. + * - we traverse all the level nodes in 2 ways: from left to right OR from right to left + * (this state is stored on `prevLevelFromLeftToRight` variable) + * - if the current node has children we add them to a queue + * - add level with nodes to a result. + *

+ * Complexities: + * O(N) - time, where N is the number of nodes in a binary tree + * O(N) - space, where N is the number of nodes in a binary tree + * + * @author Albina Gimaletdinova on 11/01/2023 + */ +public class ZigZagTraversal { + public static List> traverse(BinaryTree.Node root) { + if (root == null) { + return new ArrayList<>(); + } + + List> result = new ArrayList<>(); + + // create a queue + Deque q = new ArrayDeque<>(); + q.offer(root); + // start with writing nodes from left to right + boolean prevLevelFromLeftToRight = false; + + while (!q.isEmpty()) { + int nodesOnLevel = q.size(); + List level = new LinkedList<>(); + // traverse all the level nodes + for (int i = 0; i < nodesOnLevel; i++) { + BinaryTree.Node node = q.poll(); + if (prevLevelFromLeftToRight) { + level.add(0, node.data); + } else { + level.add(node.data); + } + if (node.left != null) { + q.offer(node.left); + } + if (node.right != null) { + q.offer(node.right); + } + } + // the next level node traversal will be from the other side + prevLevelFromLeftToRight = !prevLevelFromLeftToRight; + result.add(level); + } + return result; + } +} diff --git a/src/test/java/com/thealgorithms/datastructures/trees/ZigzagTraversalTest.java b/src/test/java/com/thealgorithms/datastructures/trees/ZigzagTraversalTest.java new file mode 100644 index 000000000000..7cdfcaf276c0 --- /dev/null +++ b/src/test/java/com/thealgorithms/datastructures/trees/ZigzagTraversalTest.java @@ -0,0 +1,30 @@ +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 11/01/2023 + */ +public class ZigzagTraversalTest { + @Test + public void testRootNull() { + assertEquals(Collections.emptyList(), ZigZagTraversal.traverse(null)); + } + + @Test + public void testSingleNodeTree() { + final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{50}); + assertEquals(List.of(List.of(50)), ZigZagTraversal.traverse(root)); + } + + @Test + public void testZigzagTraversal() { + final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{7, 6, 14, 2, 80, 100}); + assertEquals(List.of(List.of(7), List.of(14, 6), List.of(2, 80, 100)), ZigZagTraversal.traverse(root)); + } +} From df02a9ae872ed7f3cf79ca5fd8df16babce29a98 Mon Sep 17 00:00:00 2001 From: Albina Gimaletdinova Date: Thu, 12 Jan 2023 14:58:04 +0300 Subject: [PATCH 2/2] fixed file name --- .../trees/{ZigZagTraversal.java => ZigzagTraversal.java} | 2 +- .../datastructures/trees/ZigzagTraversalTest.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/main/java/com/thealgorithms/datastructures/trees/{ZigZagTraversal.java => ZigzagTraversal.java} (98%) diff --git a/src/main/java/com/thealgorithms/datastructures/trees/ZigZagTraversal.java b/src/main/java/com/thealgorithms/datastructures/trees/ZigzagTraversal.java similarity index 98% rename from src/main/java/com/thealgorithms/datastructures/trees/ZigZagTraversal.java rename to src/main/java/com/thealgorithms/datastructures/trees/ZigzagTraversal.java index 6347fa36ee08..9026fdfaa041 100644 --- a/src/main/java/com/thealgorithms/datastructures/trees/ZigZagTraversal.java +++ b/src/main/java/com/thealgorithms/datastructures/trees/ZigzagTraversal.java @@ -29,7 +29,7 @@ * * @author Albina Gimaletdinova on 11/01/2023 */ -public class ZigZagTraversal { +public class ZigzagTraversal { public static List> traverse(BinaryTree.Node root) { if (root == null) { return new ArrayList<>(); diff --git a/src/test/java/com/thealgorithms/datastructures/trees/ZigzagTraversalTest.java b/src/test/java/com/thealgorithms/datastructures/trees/ZigzagTraversalTest.java index 7cdfcaf276c0..11af07c57e0a 100644 --- a/src/test/java/com/thealgorithms/datastructures/trees/ZigzagTraversalTest.java +++ b/src/test/java/com/thealgorithms/datastructures/trees/ZigzagTraversalTest.java @@ -13,18 +13,18 @@ public class ZigzagTraversalTest { @Test public void testRootNull() { - assertEquals(Collections.emptyList(), ZigZagTraversal.traverse(null)); + assertEquals(Collections.emptyList(), ZigzagTraversal.traverse(null)); } @Test public void testSingleNodeTree() { final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{50}); - assertEquals(List.of(List.of(50)), ZigZagTraversal.traverse(root)); + assertEquals(List.of(List.of(50)), ZigzagTraversal.traverse(root)); } @Test public void testZigzagTraversal() { final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{7, 6, 14, 2, 80, 100}); - assertEquals(List.of(List.of(7), List.of(14, 6), List.of(2, 80, 100)), ZigZagTraversal.traverse(root)); + assertEquals(List.of(List.of(7), List.of(14, 6), List.of(2, 80, 100)), ZigzagTraversal.traverse(root)); } }