思路:将当前查询结点的路径上的所有结点的父亲都指向根结点
步骤
①按原先写法获得x的根结点r
②重新从x开始走一遍寻找根结点的过程,把路径上经过的所有结点的父亲全部改为根结点r
代码
int findFather(intx)
{
int a=x;
while(x!=father[x])
{
x=fater[x];
}
//x此时存放的是根结点,下面把路径上的所有结点的father都改成根结点
while(a!=father[a])
{
int z=a;//因为a要被father[a]覆盖,所以先保存a的值,以修改father[a]
a=father[a];//a回溯父亲节点
father[z]=x;//将原先的节点a的父亲节点改为根结点x;
}
return x;返回根结点;
}