(精)第6章 树.pptVIP

  • 161
  • 0
  • 约1.58万字
  • 约 93页
  • 2017-01-07 发布于北京
  • 举报
* rlink-ltag的信息冗余。因为一个结点只有一个父结点。由于是先根次序,因此在一个结点之后的结点,要么为其左,要么为其右。如果它已经是别人的右结点,则不可能为左了。 template class T ParTreeNodeT* ParTreeT::Find(ParTreeNodeT* node) { ParTreeNodeT* pointer = node; while ( pointer-getParent() != NULL) pointer = pointer-getParent(); return pointer; } 返回指向node结点所属树的根结点指针 templateclass T bool ParTreeT::Different(int i,int j) { ParTreeNodeT* pointeri = Find(array[i]); ParTreeNodeT* pointerj = Find(array[j]); return pointeri != pointerj; } 判断两个结点是否属于一棵树 templateclass T void ParTreeT::Union(int i,int j) { ParTreeNodeT* pointeri = Find(array[i]); ParTreeNodeT* pointerj = Find(array[j]); if (pointeri!=pointerj) { //数目少的结点归并到数目多的结点树中 if (pointeri-getCount( )=pointerj-getCount( )) { pointerj-setParent(pointeri); pointeri-setCount(pointeri-getCount() + pointerj-getCount()); } else { pointeri-setParent(pointerj); pointerj-setCount(pointeri-getCount() +pointerj-getCount()); } } } 重量权衡合并规则 父指针表示法并不限制共享同一父结点的结点数目。为了使等价对的处理尽可能高效,每个结点到其相应的根结点的距离应尽可能小 “重量权衡合并规则”(weighted union rule)。 将结点较少树的根结点指向结点较多树的根结点。这可以把树的整体深度限制在O(log n) UNION/FIND算法示例 使用标准重量权衡合并规则处理等价对(H,J)的结果 6.3 树的顺序存储 6.3.1 带右链的先根次序表示法 6.3.2 带双标记位的先根次序表示法 6.3.3 带度数的后根次序表示法 6.3.4 带双标记的层次次序表示法 6.3.1 带右链的先根次序表示法 在带右链的先根次序表示中,结点按先根次序顺序存储在一片连续的存储单元中。每个结点除包括结点本身数据外,还附加两个表示结构的信息字段,结点的形式为: info是结点的数据 rlink是右指针,指向结点的下一个兄弟 ltag是一个左标记,当结点没有子结点,即对应的二叉树中结点没有左子结点时,ltag为 1,否则为0 带右链的先根次序表示法特点 与llink—rlink相比,用ltag代替了llink,占用的存储单元要少,但不丢失信息 从结点的次序和ltag的值可以推知llink ltag为0的结点有左子结点,它的llink指向存储区中该结点顺序的下一个结点 ltag为1的结点没有左子结点,它的llink为空 带右链的先根次序表示法 森林 等价的二叉树 森林 带右链的先根次序rlink-ltag 6.3.2 带双标记位的先根次序表示法 带右链的先根次序表示法中每个结点都包括ltag和rlink字段,事实上rlink也不是必需的。一位rtag就足以表示出整个森林的结构信息。 规定当结点没有下一个兄弟,即对应的二叉树中结点没有右子结点时,rtag为1,否则为0 。 带双标记位的先根次序表示法 由结点的排列次序和ltag,rtag的值可推导出rlink。 当结点x的rtag为1时,rlink为空 当结点x的rtag为0时,rlink指向结点序列中排在结点x的子树结点后面的那个结点y 带双标记位的先根次序表示法 任何结点的子树

文档评论(0)

1亿VIP精品文档

相关文档