树与等价问题

Posted kirosola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树与等价问题相关的知识,希望对你有一定的参考价值。

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;
}

  

以上是关于树与等价问题的主要内容,如果未能解决你的问题,请参考以下文章

Java数据结构和算法--红黑树与2-3树

此 Canon SDK C++ 代码片段的等效 C# 代码是啥?

jsp

JSP语法

JSP 语法

二叉树与双向链表问题