@@ -122,4 +122,110 @@ public void testPathCompression() {
122
122
assertEquals (root , node1 );
123
123
assertEquals (node1 , node3 .parent );
124
124
}
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
+ }
125
231
}
0 commit comments