diff --git a/src/test/java/com/thealgorithms/datastructures/disjointsetunion/DisjointSetUnionTest.java b/src/test/java/com/thealgorithms/datastructures/disjointsetunion/DisjointSetUnionTest.java index 14dceb53c40d..581bac6151dd 100644 --- a/src/test/java/com/thealgorithms/datastructures/disjointsetunion/DisjointSetUnionTest.java +++ b/src/test/java/com/thealgorithms/datastructures/disjointsetunion/DisjointSetUnionTest.java @@ -122,4 +122,109 @@ public void testPathCompression() { assertEquals(root, node1); assertEquals(node1, node3.parent); } + + @Test + public void testUnionByRankSmallerToLarger() { + DisjointSetUnion dsu = new DisjointSetUnion<>(); + Node node1 = dsu.makeSet(1); + Node node2 = dsu.makeSet(2); + Node node3 = dsu.makeSet(3); + + // Create tree with node1 as root and rank 1 + dsu.unionSets(node1, node2); + assertEquals(1, node1.rank); + assertEquals(0, node2.rank); + + // Union single node (rank 0) with tree (rank 1) + // Smaller rank tree should attach to larger rank tree + dsu.unionSets(node3, node1); + assertEquals(node1, dsu.findSet(node3)); + assertEquals(1, node1.rank); // Rank should not increase + } + + @Test + public void testUnionByRankEqualRanks() { + DisjointSetUnion dsu = new DisjointSetUnion<>(); + Node node1 = dsu.makeSet(1); + Node node2 = dsu.makeSet(2); + Node node3 = dsu.makeSet(3); + Node node4 = dsu.makeSet(4); + + // Create two trees of equal rank (1) + dsu.unionSets(node1, node2); + dsu.unionSets(node3, node4); + assertEquals(1, node1.rank); + assertEquals(1, node3.rank); + + // Union two trees of equal rank + dsu.unionSets(node1, node3); + Node root = dsu.findSet(node1); + assertEquals(2, root.rank); // Rank should increase by 1 + } + + @Test + public void testLargeChainPathCompression() { + DisjointSetUnion dsu = new DisjointSetUnion<>(); + Node node1 = dsu.makeSet(1); + Node node2 = dsu.makeSet(2); + Node node3 = dsu.makeSet(3); + Node node4 = dsu.makeSet(4); + Node node5 = dsu.makeSet(5); + + // Create a long chain: 1 -> 2 -> 3 -> 4 -> 5 + dsu.unionSets(node1, node2); + dsu.unionSets(node2, node3); + dsu.unionSets(node3, node4); + dsu.unionSets(node4, node5); + + // Find from the deepest node + Node root = dsu.findSet(node5); + + // Path compression should make all nodes point directly to root + assertEquals(root, node5.parent); + assertEquals(root, node4.parent); + assertEquals(root, node3.parent); + assertEquals(root, node2.parent); + assertEquals(root, node1.parent); + } + + @Test + public void testMultipleDisjointSets() { + DisjointSetUnion dsu = new DisjointSetUnion<>(); + Node node1 = dsu.makeSet(1); + Node node2 = dsu.makeSet(2); + Node node3 = dsu.makeSet(3); + Node node4 = dsu.makeSet(4); + Node node5 = dsu.makeSet(5); + Node node6 = dsu.makeSet(6); + + // Create two separate components + dsu.unionSets(node1, node2); + dsu.unionSets(node2, node3); + + dsu.unionSets(node4, node5); + dsu.unionSets(node5, node6); + + // Verify they are separate + assertEquals(dsu.findSet(node1), dsu.findSet(node2)); + assertEquals(dsu.findSet(node2), dsu.findSet(node3)); + assertEquals(dsu.findSet(node4), dsu.findSet(node5)); + assertEquals(dsu.findSet(node5), dsu.findSet(node6)); + + assertNotEquals(dsu.findSet(node1), dsu.findSet(node4)); + assertNotEquals(dsu.findSet(node3), dsu.findSet(node6)); + } + + @Test + public void testEmptyValues() { + DisjointSetUnion dsu = new DisjointSetUnion<>(); + Node emptyNode = dsu.makeSet(""); + Node nullNode = dsu.makeSet(null); + + assertEquals(emptyNode, dsu.findSet(emptyNode)); + assertEquals(nullNode, dsu.findSet(nullNode)); + + dsu.unionSets(emptyNode, nullNode); + assertEquals(dsu.findSet(emptyNode), dsu.findSet(nullNode)); + } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy