集合表示
利用树来表示集合,例如有0到9的10个元素,可将其划分为三个不想交的几个 s1{0,6,7,8}, s2{1,4,9}, s3{2,3,5}
则集合可能的森林表示为

在这些集合上希望执行的操作
1.不想交集合并Union(i,j)
2.查找Find(i)

集合s1,s2,s3存储表示

在union操作中用加权规则合并(i,j)如果i节点数小于j结点数,另树j是i的父亲,
这就该表存储表示结构,如果0是父节点。则parent[0]=-5 负数表示是根节点,5表示集合个数
森林表示集合
class Forest
{
public:
Forest(int items); //森林中元素个数
int Find(int n); //找出元素所在集合
void Union(int i,int j); //合并两个不同的集合
void Delete(int x);
private:
int n; //集合中所有元素个数
int *parent; //集合数组存储表示
};
Forest::Forest(int items)
{
n=items;
this->parent=new int[n];
if(!parent)
{
cout<<"error:new node error"<<endl;
}else
{
for (int i=0;i<n;i++)
parent[i]=-1;
}
}
//查找集合
int Forest::Find(int i)
{
//parent[n]=-1 表示n就是集合名
//parent[n]>0 表示 n的父节点是parent[n]
//parent[n]=-2 表示已删掉,或以不存在元素
if (parent[i]==-2||i>n)
{
return -2;
}
else
{
for (;parent[i]>=0;i=parent[i]);
return i;
}
}
//归并集合,其中i和j是集合根节点
void Forest::Union(int i,int j)
{
int temp=parent[i]+parent[j];
if (parent[i]>parent[j])
{
parent[i]=j;
parent[j]=temp;
}
else
{
parent[j]=i;
parent[i]=temp;
}
}

浙公网安备 33010602011771号