数据结构 第6章 树和森林.ppt

  1. 1、本文档共137页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构第6章树和森林要点

对于并查集来说,每个子集合(等价类)用一棵树表示,子集合中每个元素用树中的一个结点表示。为了处理简单,用树的根结点来代表相应的等价类集合。在此,等价类树用双亲表示法表示(当然根据需要可以建立集合名字到表示该集合的树的根结点之间的对应关系); 此外,树的根结点的双亲域的值设为-k(parent=-k),其中k为该树中的结点数(即所代表等价类中的元素数目)。若有三个等价类:S1={a、b、c},S2={d、e、f、g},S3={h、i、j},则表示它们的并查集的树结构如右图所示。 在这种表示方法中,可以方便的实现并查集的合并和查找操作。对于任意给定的集合元素d,只要通过双亲指针向上一直走到树的根结点,就可以得到元素d所在的等价类(用根结点代表相应的等价类)。对于两个集合的并,只要将表示其中一个集合的树的根结点置为表示另一个集合的树的根结点的孩子即可。右图给出了对前图所表示的三个等价类S1、S2和S3实现S1?S2的两种方法。 并查集的类定义: template class Type class UFSets; template class Type class TreeNode { //定义树的双亲表示结点类 friend class UFSets; private: Type data; //数据域 int parent; //双亲域 }; template class Type class UFSets { //并查集的类定义 public: UFSets ( Type * arr , int n ); //构造函数 ~UFSets ( ) { delete [ ] sets; } //析造函数 void Union ( int set1, int set2 ); //合并函数 int Find ( Type d ); //查找函数 void UnionByHeight ( int set1 , set2 ); private: TreeNodeType *sets; //存储集合元素的数组 int size; //集合的大小 int Order( Type d ); //定位函数,确定数据元素d在数组中的位置 }; 下面给出并查集主要成员函数的实现。 构造函数UFSets( )根据arr[]数组中给出的数据元素(数组中有n个元素),构造n个只含有一个单元素的等价类的集合。 template class Type UFSetsType :: UFSets (Type * arr , int n ) { //构造函数 size = n; sets = new TreeNodeType [size]; for( int i = 0; i size; i++ ) { sets.parent[i] = -1; sets.data[i] = arr[i];} } 私有成员函数Order( )用于确定给定数据元素d在集合数组中的位置(即数组的下标)。如果在集合中不存在元素d,函数返回-1;否则返回元素d在数组中的下标。 template class Type int UFSetsType :: Order ( Type d ) { //定位函数,确定数据元素d在数组中的位置 int p=0; while (psize) if ( sets[p].data=d ) return p; else p++; return -1; } 成员函数Find( )确定数据元素d所在的等价类,如果元素d不在任何等价类中,函数返回-1;否则返回元素d所在等价类的根结点在数组中的下标。 template class Type int UFSetsType :: Find ( Type d ) { //查找函数,确定数据元素d所在的等价类 int p; if ( (p = Order(d) ) == -1 ) return -1 ; //元素d不在任何等价类中 if ( sets[p].parent 0 ) return p; //p为一个等价类根结点的序号 else return Find (sets[sets[p].parent].data );//求p的双亲所在的等价类 } 成员函数Union( )把以s1、s2为根的两个等价类合并成一个等价类

您可能关注的文档

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档