@@ -122,4 +122,109 @@ 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
+
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
+ }
125
230
}
0 commit comments