第四章树与树的表示(五)详解.ppt

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

4.6.3 集合及运算 1 1.集合的表示 ? 集合运算:交、并、补、差,判定一个元素是否属于某一集合 ? 并查集:集合并、查某元素属于什么集合 ? 并查集问题中集合存储如何实现? ? 可以用树结构表示集合,树的每个结点代表一个集合元素 例如,有三个整数集合 S1={1,2,4,7} S2={3,5,8} S3={6,9,10} 集合名 指针 双亲表示法: 孩子指向双亲。 S1 S2 S3 2 4 6 7 5 3 8 9 10 ? 采用数组存储形式 下标 0 1 2 3 4 Data 1 2 3 4 5 Parent -1 0 -1 0 2 数组中每个元素的类型描述为: typedef struct { ElementType Data; int Parent; } SetType; 5 6 -1 1 3 6 6 7 0 7 8 8 9 2 5 2 4 7 5 8 9 10 9 10 5 负数表示根结点; 非负数表示双亲结 点的下标。 { 2.集合运算 (1)查找某个元素所在的集合(用根结点表示) int Find( SetType S[ ], ElementType X ) /* 在数组S中查找值为X的元素所属的集合 */ /* MaxSize是全局变量,为数组S的最大长度 */ int i; for ( i=0; i MaxSize S[i].Data != X; i++) ; if( i = MaxSize ) return -1; /* 未找到X,返回-1 */ for( ; S[i].Parent = 0; i = S[i].Parent ) ; return i; /* 找到X所属集合,返回树根结点在数组S中的下标 */ } (2) 集合的并运算 ? 分别找到X1和X2两个元素所在集合树的根结点 ? 如果它们不同根,则将其中一个根结点的父结点指针设置成 另一个根结点的数组下标。 void Union( SetType S[ ], ElementType X1, ElementType X2 ) { int Root1, Root2; 当x1和x2不属于同一 子集时,才需要合并 Root1 = Find(S, X1); Root2 = Find(S, X2); if( Root1 != Root2 )S[Root2].Parent = Root1; } 改成-7。表示集 下标 data Parent 合有7个元素 0 1 1 2 -1 0 1 6 2 3 0 2 4 7 3 9 10 3 4 0 4 5 5 6 2 -1 5 8 6 7 8 9 7 8 9 10 0 2 5 5 改成-3。表示集 合有3个元素 为了改善合并以后的查找 性能,可以采用小的集合 合并到相对大的集合中。 (修改Union函数) 作业: 1.课本154页题目4.6. 2.课本154页题目4.7. 3. 一棵深度为h的满k叉树有如下性质: 第h层上的结点都是叶子结点,其余 各层上每个结点都有k棵非空子树。 如果按层次顺序(同层自左至右)从1开始 对全部结点编号,问: ① 各层的结点数是多少? ② 编号为i的结点的双亲结点(若存在)的编号是多少? ③ 编号为i的结点的第j个孩子结点(若存在)的编号是多少? ④ 编号为i的结点的有右兄弟的条件是什么? 其右兄弟的编号是多少? 4.在最大堆 {97,76,65,50,49,13,27}中插入83后,该最大堆为:.. A.{97,76,65,83,49,13,27,50} B.{97,83,65,76,49,13,27,50} C.{97,83,65,76,50,13,27,49} D.{97,83,65,76,49,50,13,27}

文档评论(0)

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

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

1亿VIP精品文档

相关文档