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