@@ -122,4 +122,109 @@ public void testPathCompression() {
122122 assertEquals (root , node1 );
123123 assertEquals (node1 , node3 .parent );
124124 }
125+
126+ @ Test
127+ public void testUnionByRankSmallerToLarger () {
128+ DisjointSetUnion <Integer > dsu = new DisjointSetUnion <>();
129+ Node <Integer > node1 = dsu .makeSet (1 );
130+ Node <Integer > node2 = dsu .makeSet (2 );
131+ Node <Integer > node3 = dsu .makeSet (3 );
132+
133+ // Create tree with node1 as root and rank 1
134+ dsu .unionSets (node1 , node2 );
135+ assertEquals (1 , node1 .rank );
136+ assertEquals (0 , node2 .rank );
137+
138+ // Union single node (rank 0) with tree (rank 1)
139+ // Smaller rank tree should attach to larger rank tree
140+ dsu .unionSets (node3 , node1 );
141+ assertEquals (node1 , dsu .findSet (node3 ));
142+ assertEquals (1 , node1 .rank ); // Rank should not increase
143+ }
144+
145+ @ Test
146+ public void testUnionByRankEqualRanks () {
147+ DisjointSetUnion <Integer > dsu = new DisjointSetUnion <>();
148+ Node <Integer > node1 = dsu .makeSet (1 );
149+ Node <Integer > node2 = dsu .makeSet (2 );
150+ Node <Integer > node3 = dsu .makeSet (3 );
151+ Node <Integer > node4 = dsu .makeSet (4 );
152+
153+ // Create two trees of equal rank (1)
154+ dsu .unionSets (node1 , node2 );
155+ dsu .unionSets (node3 , node4 );
156+ assertEquals (1 , node1 .rank );
157+ assertEquals (1 , node3 .rank );
158+
159+ // Union two trees of equal rank
160+ dsu .unionSets (node1 , node3 );
161+ Node <Integer > root = dsu .findSet (node1 );
162+ assertEquals (2 , root .rank ); // Rank should increase by 1
163+ }
164+
165+ @ Test
166+ public void testLargeChainPathCompression () {
167+ DisjointSetUnion <Integer > dsu = new DisjointSetUnion <>();
168+ Node <Integer > node1 = dsu .makeSet (1 );
169+ Node <Integer > node2 = dsu .makeSet (2 );
170+ Node <Integer > node3 = dsu .makeSet (3 );
171+ Node <Integer > node4 = dsu .makeSet (4 );
172+ Node <Integer > node5 = dsu .makeSet (5 );
173+
174+ // Create a long chain: 1 -> 2 -> 3 -> 4 -> 5
175+ dsu .unionSets (node1 , node2 );
176+ dsu .unionSets (node2 , node3 );
177+ dsu .unionSets (node3 , node4 );
178+ dsu .unionSets (node4 , node5 );
179+
180+ // Find from the deepest node
181+ Node <Integer > root = dsu .findSet (node5 );
182+
183+ // Path compression should make all nodes point directly to root
184+ assertEquals (root , node5 .parent );
185+ assertEquals (root , node4 .parent );
186+ assertEquals (root , node3 .parent );
187+ assertEquals (root , node2 .parent );
188+ assertEquals (root , node1 .parent );
189+ }
190+
191+ @ Test
192+ public void testMultipleDisjointSets () {
193+ DisjointSetUnion <Integer > dsu = new DisjointSetUnion <>();
194+ Node <Integer > node1 = dsu .makeSet (1 );
195+ Node <Integer > node2 = dsu .makeSet (2 );
196+ Node <Integer > node3 = dsu .makeSet (3 );
197+ Node <Integer > node4 = dsu .makeSet (4 );
198+ Node <Integer > node5 = dsu .makeSet (5 );
199+ Node <Integer > node6 = dsu .makeSet (6 );
200+
201+ // Create two separate components
202+ dsu .unionSets (node1 , node2 );
203+ dsu .unionSets (node2 , node3 );
204+
205+ dsu .unionSets (node4 , node5 );
206+ dsu .unionSets (node5 , node6 );
207+
208+ // Verify they are separate
209+ assertEquals (dsu .findSet (node1 ), dsu .findSet (node2 ));
210+ assertEquals (dsu .findSet (node2 ), dsu .findSet (node3 ));
211+ assertEquals (dsu .findSet (node4 ), dsu .findSet (node5 ));
212+ assertEquals (dsu .findSet (node5 ), dsu .findSet (node6 ));
213+
214+ assertNotEquals (dsu .findSet (node1 ), dsu .findSet (node4 ));
215+ assertNotEquals (dsu .findSet (node3 ), dsu .findSet (node6 ));
216+ }
217+
218+ @ Test
219+ public void testEmptyValues () {
220+ DisjointSetUnion <String > dsu = new DisjointSetUnion <>();
221+ Node <String > emptyNode = dsu .makeSet ("" );
222+ Node <String > nullNode = dsu .makeSet (null );
223+
224+ assertEquals (emptyNode , dsu .findSet (emptyNode ));
225+ assertEquals (nullNode , dsu .findSet (nullNode ));
226+
227+ dsu .unionSets (emptyNode , nullNode );
228+ assertEquals (dsu .findSet (emptyNode ), dsu .findSet (nullNode ));
229+ }
125230}
0 commit comments