码迷,mamicode.com
首页 > 其他好文 > 详细

树与等价问题

时间:2019-12-18 23:49:25      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:else   data   type   +=   集中   目的   改进   struct   fse   

typedef struct {
	TElemType data;
	int parent;
}PTNode;
typedef struct {
	PTNode nodes[MAX_TREE_SIZE];
	int r, n;//根结点所在位置和结点数
}PTree;
typedef PTree MFset;

 

查找i所属子集

int find_mfset(MFset S, int i)
{
	int j;
	if (i<1 || i>S.n)
		return -1;
	for (j = i; S.nodes[j].parent > 0; j = S.nodes[j].parent);
	return j;
}

 

集合的并

int merge_mfset(MFset& S, int i, int j)
{
	if (i<1 || i>S.n || j<1 || j>S.n)
		return -1;
	S.nodes[i].parent = j;
	return 1;
}

  改进并操作算法,令成员较少的子集树指向成员较多的子集树的根;令根的parent为存储子集中所含成员数目的负值。

int min_mfset(MFset& S, int i, int j)
{
	if (i<1 || i>S.n || j<1 || j>S.n)
		return -1;
	if (S.nodes[i].parent < S.nodes[j].parent)
	{
		S.nodes[j].parent = i;
		S.nodes[i].parent += S.nodes[j].parent;
	}
	else
	{
		S.nodes[i].parent = j;
		S.nodes[j].parent += S.nodes[i].parent;
	}
	return 1;
}

  改进查找子集算法,当所查找的元素i不在树的第二层,在算法中增添一个压缩路径的功能,即将所有从根到元素i路径上的元素都变成树根的孩子

int mix_mfset(MFset& S, int i)
{
	int i, j, k, t;
	if (i<1 || i>S.n)
		return -1;
	for (j = i; S.nodes[j].parent > 0; j = S.nodes[j].parent);
	for (k = i; k != j; k = t )
	{
		S.nodes[k].parent = j;
		t = S.nodes[k].parent;
	}
	return j;
}

  

树与等价问题

标签:else   data   type   +=   集中   目的   改进   struct   fse   

原文地址:https://www.cnblogs.com/KIROsola/p/12064497.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!