From 79319f99fe7813f562c3bb81f2cc7fab0e6e0d26 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Wed, 5 Oct 2022 00:19:28 +0530 Subject: [PATCH 1/2] 3395: Adding unit test for CeilInBinarySearchTree file --- .../trees/CeilInBinarySearchTreeTest.java | 51 +++++++++++++++++++ .../datastructures/trees/TreeTestUtils.java | 44 ++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 src/test/java/com/thealgorithms/datastructures/trees/CeilInBinarySearchTreeTest.java create mode 100644 src/test/java/com/thealgorithms/datastructures/trees/TreeTestUtils.java diff --git a/src/test/java/com/thealgorithms/datastructures/trees/CeilInBinarySearchTreeTest.java b/src/test/java/com/thealgorithms/datastructures/trees/CeilInBinarySearchTreeTest.java new file mode 100644 index 000000000000..ab865ff64404 --- /dev/null +++ b/src/test/java/com/thealgorithms/datastructures/trees/CeilInBinarySearchTreeTest.java @@ -0,0 +1,51 @@ +package com.thealgorithms.datastructures.trees; + +import com.thealgorithms.datastructures.trees.BinaryTree.Node; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class CeilInBinarySearchTreeTest { + + @Test + public void testRootNull() { + assertNull(CeilInBinarySearchTree.getCeil(null, 9)); + } + + @Test + public void testKeyPresentRootIsCeil() { + final Node root = TreeTestUtils.createTree(new Integer[]{100, 10, 200}); + assertEquals(100, CeilInBinarySearchTree.getCeil(root, 100).data); + } + + @Test + public void testKeyPresentLeafIsCeil() { + final Node root = TreeTestUtils.createTree(new Integer[]{100, 10, 200}); + assertEquals(10, CeilInBinarySearchTree.getCeil(root, 10).data); + } + + @Test + public void testKeyAbsentRootIsCeil() { + final Node root = TreeTestUtils.createTree(new Integer[]{100, 10, 200, 5, 50, 150, 300}); + assertEquals(100, CeilInBinarySearchTree.getCeil(root, 75).data); + } + + @Test + public void testKeyAbsentLeafIsCeil() { + final Node root = TreeTestUtils.createTree(new Integer[]{100, 10, 200, 5, 50, 150, 300}); + assertEquals(50, CeilInBinarySearchTree.getCeil(root, 40).data); + } + + @Test + public void testKeyAbsentLeftMostNodeIsCeil() { + final Node root = TreeTestUtils.createTree(new Integer[]{100, 10, 200, 5, 50, 150, 300}); + assertEquals(5, CeilInBinarySearchTree.getCeil(root, 1).data); + } + + @Test + public void testKeyAbsentCeilIsNull() { + final Node root = TreeTestUtils.createTree(new Integer[]{100, 10, 200, 5, 50, 150, 300}); + assertNull(CeilInBinarySearchTree.getCeil(root, 400)); + } +} diff --git a/src/test/java/com/thealgorithms/datastructures/trees/TreeTestUtils.java b/src/test/java/com/thealgorithms/datastructures/trees/TreeTestUtils.java new file mode 100644 index 000000000000..e24215bbf31b --- /dev/null +++ b/src/test/java/com/thealgorithms/datastructures/trees/TreeTestUtils.java @@ -0,0 +1,44 @@ +package com.thealgorithms.datastructures.trees; + +import java.util.LinkedList; +import java.util.Queue; +import com.thealgorithms.datastructures.trees.BinaryTree.Node; + +public class TreeTestUtils { + + /** + * Creates a binary tree with given values + * + * @param values: Level order representation of tree + * @return Root of a binary tree + */ + public static Node createTree(final Integer[] values) { + if (values == null || values.length == 0 || values[0] == null) { + return null; + } + final Node root = new Node(values[0]); + final Queue queue = new LinkedList<>(); + queue.add(root); + int end = 1; + while (end < values.length) { + final Node node = queue.remove(); + if (values[end] == null) { + node.left = null; + } else { + node.left = new Node(values[end]); + queue.add(node.left); + } + end++; + if (end < values.length) { + if (values[end] == null) { + node.right = null; + } else { + node.right = new Node(values[end]); + queue.add(node.right); + } + } + end++; + } + return root; + } +} From 2de242c2a1c1bfb3bbc59bcf3b01dc2d4b6c62e8 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Mon, 10 Oct 2022 01:27:45 +0530 Subject: [PATCH 2/2] 3471: Check if a binary tree is symmetric or not --- .../trees/CheckTreeIsSymmetric.java | 53 +++++++++++++++++++ .../trees/CheckTreeIsSymmetricTest.java | 36 +++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 src/main/java/com/thealgorithms/datastructures/trees/CheckTreeIsSymmetric.java create mode 100644 src/test/java/com/thealgorithms/datastructures/trees/CheckTreeIsSymmetricTest.java diff --git a/src/main/java/com/thealgorithms/datastructures/trees/CheckTreeIsSymmetric.java b/src/main/java/com/thealgorithms/datastructures/trees/CheckTreeIsSymmetric.java new file mode 100644 index 000000000000..713dc083a93a --- /dev/null +++ b/src/main/java/com/thealgorithms/datastructures/trees/CheckTreeIsSymmetric.java @@ -0,0 +1,53 @@ +package com.thealgorithms.datastructures.trees; + +import com.thealgorithms.datastructures.trees.BinaryTree.Node; + +/** + * Check if a binary tree is symmetric or not. + * A binary tree is a symmetric tree if the left and right subtree of root are mirror image. + * Below is a symmetric tree + * 1 + * / \ + * 2 2 + * / \ / \ + * 3 4 4 3 + * + * Below is not symmetric because values is different in last level + * 1 + * / \ + * 2 2 + * / \ / \ + * 3 5 4 3 + *

+ * Approach: + * Recursively check for left and right subtree of root + * 1. left subtrees root's values should be equal right subtree's root value + * 2. recursively check with left subtrees' left child VS right subtree's right child AND + * left subtree's right child VS right subtree left child + * Complexity + * 1. Time: O(n) + * 2. Space: O(lg(n)) for height of tree + * + * @author kumanoit on 10/10/22 IST 12:52 AM + */ +public class CheckTreeIsSymmetric { + + public static boolean isSymmetric(Node root) { + if (root == null) { + return true; + } + return isSymmetric(root.left, root.right); + } + + private static boolean isSymmetric(Node leftSubtreeRoot, Node rightSubtreRoot) { + if (leftSubtreeRoot == null && rightSubtreRoot == null) { + return true; + } + + if (leftSubtreeRoot == null || rightSubtreRoot == null || leftSubtreeRoot.data != rightSubtreRoot.data) { + return false; + } + + return isSymmetric(leftSubtreeRoot.right, rightSubtreRoot.left) && isSymmetric(leftSubtreeRoot.left, rightSubtreRoot.right); + } +} diff --git a/src/test/java/com/thealgorithms/datastructures/trees/CheckTreeIsSymmetricTest.java b/src/test/java/com/thealgorithms/datastructures/trees/CheckTreeIsSymmetricTest.java new file mode 100644 index 000000000000..932d5b882cf9 --- /dev/null +++ b/src/test/java/com/thealgorithms/datastructures/trees/CheckTreeIsSymmetricTest.java @@ -0,0 +1,36 @@ +package com.thealgorithms.datastructures.trees; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * @author kumanoit on 10/10/22 IST 1:02 AM + */ +public class CheckTreeIsSymmetricTest { + + @Test + public void testRootNull() { + assertTrue(CheckTreeIsSymmetric.isSymmetric(null)); + } + + @Test + public void testSingleNodeTree() { + final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{100}); + assertTrue(CheckTreeIsSymmetric.isSymmetric(root)); + } + + @Test + public void testSymmetricTree() { + final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{1,2,2,3,4,4,3}); + assertTrue(CheckTreeIsSymmetric.isSymmetric(root)); + } + + @Test + public void testNonSymmetricTree() { + final BinaryTree.Node root = TreeTestUtils.createTree(new Integer[]{1,2,2,3,5,4,3}); + assertFalse(CheckTreeIsSymmetric.isSymmetric(root)); + } + +}