并查集顾名思义有两个功能,,
一是查询两个节点在不在一个集合,这可以通过递归对父节点的应用实现查询根节点,只要两节点根节点相同则在一个集合
二是把两个集合并在一起,这可以通过把一个集合的根节点的父节点指针指向另一个集合的根节点。
目录
1.测试程序
public static void main(String[] args) {
int[] data = {-1, 0, -1, 0, 2, -1, 0, 4, 5, 8};
//测试基本操作
for (int i = 0; i < 10; i++) {
data[i] = findRoot(data, i);
tellRoot(data, i);
}
System.out.println(Arrays.toString(data));
System.out.println("0,2在一个集合:"+areAGroup(data, 0, 2));
Union(data, 0, 2);
//测试两集合结合后的效果
System.out.println(Arrays.toString(data));
System.out.println("0,2在一个集合:"+areAGroup(data, 0, 2));
}
2.寻根,并压缩路径的方法
//寻找根节点,并同时压缩路径的方法:输入数组和节点位置,将节点内容从父节点改为根节点
public static int findRoot(int[] deposit, int node) {
if (deposit[node] >= 0) {
return findRootDetail(deposit, deposit[node]);
} else {
return deposit[node];//本身是根节点,直接返回节点存储值即可
}
}
public static int findRootDetail(int[] deposit, int node) {
if(deposit[node] < 0) {//如果该节点内容小于0则该节点为根节点
return node;
} else {
ret