union-find树结构代码,考虑路径压缩和秩启发式规则。
直接上源代码:
#include <stdio.h>
#include <malloc.h>
typedef struct Node
{
int name;//节点名
//int count;//以此节点为根的子节点数量
int father;//父亲节点
int rank;//秩
}TreeNode, *BiTree;
BiTree initializeNode(int num)
{
BiTree tn=(BiTree)malloc(num*sizeof(TreeNode));
for (int i=0;i<num;i++)
{
tn[i].name=i;
//tn[i].count=1;
tn[i].father=i;//父节点为自己
tn[i].rank=0;
}
return tn;
}
/************************************************************************
找到某个节点的根节点
输入参数:
root 根据节点名找到节点编号
tn:根据节点编号查询其父节点
name:节点名
输出参数:
index:根结点节点编号
************************************************************************/
int find(int *root,BiTree tn,int name){
int index=root[name];
BiTree t=&tn[index];
if (t->father!=index)
{
t->father=find(root,tn,tn[t->father].name);
}
return t->father;
}
//两个根结点合并
void f_union(int *root,BiTree bt,int name1,int name2,int re_name){
int index1=find(root,bt,name1);
int index2=find(root,bt,name2);
BiTree t1=&bt[index1];
BiTree t2=&bt[index2];
if (t1->rank>=t2->rank){
//如果T1的秩大,即T1的树高度高
t2->father=index1;
if (t1->rank==t2->rank){
t1->rank++;
}
if (re_name>=0)
{
t1->name=re_name;
root[re_name]=index1;
}
}
else{
t1->father=index2;
if (re_name>=0)
{
t2->name=re_name;
root[re_name]=index2;
}
}
}
void n_union(int *root,BiTree bt,int name1,int name2){
f_union(root,bt,name1,name2,-1);
}
void main()
{
int num=6;
BiTree tn=initializeNode(num);
int root[11]={-1};
for (int i=0;i<num;i++)
{
root[i]=i;
}
n_union(root,tn,1,2);
n_union(root,tn,3,4);
n_union(root,tn,4,5);
n_union(root,tn,4,2);
n_union(root,tn,2,0);
for (int i=0;i<num;i++)
{
printf("index:%d, ",i);
printf("name:%d, ",tn[i].name);
printf("rank:%d, ",tn[i].rank);
printf("father:%d\n",tn[i].father);
}
printf("root[name]:index\n");
for (int i=0;i<12;i++)
{
printf("root[%d]:%d\n",i,root[i]);
}
printf("\nprint end");
char ch = getchar();
}
分享到:
相关推荐
- `class UnionFind`:自定义的并查集类,包括 `find()`(查找顶点所属集合的根节点)和 `unionSet()`(合并两个集合)等方法。 - `void kruskalMST()`:Kruskal算法的主要函数,进行上述步骤。 在代码设计和变量...
3. Link-by-Rank:每个集合使用一个树形结构来存储元素,FIND操作时间复杂度为O(log n),UNION操作时间复杂度为O(log n)。 4. Path Compression:在FIND操作中,对路径进行压缩,以减少FIND操作的时间复杂度。 5. ...
并查集(Union-Find Sets)是数据结构中一种用于管理元素集合的高效算法,它主要处理两个操作:连接(union)与查找(find)。在并查集中,元素被分到不同的集合中,每个集合代表一个独立的组件。连接操作将两个元素...
并查集(Union-Find)是一种在图论和算法设计中常见的数据结构,主要用于处理一些不相交集合的合并与查询问题。它在前端开发面试中也是一个重要的考察点,因为并查集可以解决许多实际场景中的问题,如网络连接、社交...
并查集(Union-Find)是一种用于处理连接关系的数据结构,它在计算机科学中有着广泛的应用,尤其是在图论、算法设计以及数据结构的学习中。这个数据结构的主要目标是高效地解决“查找”和“合并”两个操作,常用于...
1. **合并-查找(Union-Find)数据结构**:这是解决渗透问题的关键。在这个问题中,我们有一个n*n的网格,每个点可以是Open或Closed状态。当最底部的点与最顶端的点连通时,我们认为系统是渗透的。使用并查集可以...
2. **树形结构**:如二叉树、二叉搜索树、平衡树(AVL树、红黑树)、堆(优先队列)等。试题可能包含对树的遍历(前序、中序、后序)、查找、插入和删除操作的实现和分析。 3. **图论基础**:包括图的表示(邻接...
不相交集(Disjoint Sets)是一种数据结构,用于维护一组元素,这些元素可以被分成多个...通过阅读和理解`Disjoint-Sets-using-Union-Find-main`代码,可以深入学习不相交集的原理以及Java中如何高效实现这一数据结构。
4. Kruskal's算法和Prim's算法:这两种是最小生成树算法,用于构建连接所有顶点的树,使得树的总边权重尽可能小。Kruskal's算法基于边的选择,而Prim's算法基于顶点的添加。 5. Ford-Fulkerson算法:解决网络流问题...
- **树结构**:集合内的节点通过边连接,形成一棵树,根节点为树的顶部。 - **路径压缩**:一种优化技巧,通过直接链接子节点到父节点的祖先,减少查找路径长度。 ### 2. `find` 操作 `find` 操作用于确定一个元素...
从给定的代码中可以看到,Kruskal算法的实现方式是使用了union-find数据结构来存储图中的顶点信息,并使用排序算法来对边进行排序,然后不断地选择权值最小的边。Prim算法的实现方式是使用了数组来存储图中的顶点...
数据结构和算法设计 在算法设计中,数据结构扮演着...这篇lecture slides涵盖了数据结构和算法设计的多个方面,包括静态问题、动态问题、算法和数据结构、Amortized Analysis、Union-Find数据结构和Appetizer问题。
**UnionFind算法**,也称为并查集算法,是一种用于解决动态连通性问题的数据结构。该算法主要用于判断图中的两个节点是否属于同一个连通分量,并且可以高效地合并不同的连通分量。UnionFind算法在多种场景下都有广泛...
这个压缩包“算法-树形结构- 并查集.rar”包含了关于并查集的详细讲解,主要文件是“树形结构- 并查集.pdf”。以下是对并查集这一概念的详细介绍: 并查集的主要操作包括两个:**查找(Find)** 和 **合并(Union)...
在“树形结构- 并查集- 基本操作.pdf”文档中,可能会详细介绍这些操作的实现细节,包括伪代码和示例,以及可能涉及的优化技巧,如路径压缩和按秩合并的实现。此外,还可能包含了各种问题的实例分析和解题策略,帮助...