算法导论 实验四 常见平衡树的实现与比较.pdfVIP

算法导论 实验四 常见平衡树的实现与比较.pdf

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

实验四常见平衡树的实现与比较

1.问题描述:

代码实现红黑和AVL树

2.算法原理:

a)树的旋转知

当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质。

为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树种某些结点的颜色及指针结

构,以达到对红黑树进行

插入、删除结点等操作时,红黑树依然能保持它特有的性质(如上文所述的,五点性质)。

树的旋转,分为左旋和右旋,以下借助图来做形象的解释和介绍:

i.左旋

如上图所示:

当在某个结点pivot上,做左旋操作时,我们假设它的右孩子y不是NIL[T],pivot可以为树

内任意右孩子而不是NIL[T]的结点。

左旋以pivot到y之间的链为“支轴”进行,它使y成为该孩子树新的根,而y的左孩子b则

成为pivot的右孩子。

ii.右旋

右旋与左旋差不多,再此不做详细介绍。

b)红黑树插入、删除操作的具体实现

i.插入操作各种可能的情况

情况1:插入的是根结点。

原树是空树,此情况只会违反性质2。

对策:直接把此结点涂为黑色。

情况2:插入的结点的父结点是黑色。

此不会违反性质2和性质4,红黑树没有被破坏。

对策:什么也不做。

情况3:当前结点的父结点是红色且祖父结点的另一个子结点(叔叔结点)是红色。

此时父结点的父结点一定存在,否则插入前就已不是红黑树。

与此同时,又分为父结点是祖父结点的左子还是右子,对于对称性,我们只要解开一个方向

就可以了。

在此,我们只考虑父结点为祖父左子的情况。

同时,还可以分为当前结点是其父结点的左子还是右子,但是处理方式是一样的。我们将此

归为同一类。

对策:将当前节点的父节点和叔叔节点涂黑,祖父结点涂红,把当前结点指向祖父节点,

从新的当前节点重新开始算法。

针对情况3,变化前(图片来源:saturnman)[插入4节点]:

变化后:

情况4:当前节点的父节点是红色,叔叔节点是黑色,当前节点是其父节点的右子

对策:当前节点的父节点做为新的当前节点,以新当前节点为支点左旋。

如下图所示,变化前[插入7节点]:

变化后:

情况5:当前节点的父节点是红色,叔叔节点是黑色,当前节点是其父节点的左子

解法:父节点变为黑色,祖父节点变为红色,在祖父节点为支点右

如下图所示[插入2节点]

变化后:

ii.删除操作各种可能的情况

情况1:当前节点是红色

解法,直接把当前节点染成黑色,结束。

此时红黑树性质全部恢复。

情况2:当前节点是黑色且是根节点

解法:什么都不做,结

情况3:当前节点是黑色,且兄弟节点为红色(此时父节点和兄弟节点的子节点分为黑)。

解法:把父节点染成红色,把兄弟结点染成黑色,之后重新进入算法(我们只讨论当前

节点是其父节点左孩子时的情况)。

然后,针对父节点做一次左旋。此变换后原红黑树性质5不变,而把问题转化为兄弟节

点为黑色的情况。

3.变化前:

3.变化后:

情况4:当前节点是黑色,且兄弟是黑色,且兄弟节点的两个子节点全为黑色。

解法:把当前节点和兄弟节点中抽取一重黑色追加到父节点上,把父节点当成新的当前

节点,重新进入算法。(此变换后性质5不变)

4.变化前

4.变化后

情况5:当前节点颜色是黑色,兄弟节点是黑色,兄弟的左子是红色,右子是黑色。

解法:把兄弟结点染红,兄弟左子节点染黑,之后再在兄弟节点为支点解右旋,

之后重新进入算法。此是把当前的情况转化为情况6,而性质5得以保持。

5.变化前:

5.变化后:

情况6:当前节点颜色是黑色,它的兄弟节点是黑色,但是兄弟节点的右子是红色,兄弟节

点左子的颜色任意。

解法:把兄弟节点染成当前节点父节点的颜色,把当前节点父节点染成黑色,兄弟节点

右子染成黑色,

之后以当前节点的父节点为支点进行左旋,此时算法结束,红黑树所有性质调整正确。

6.变化前:

6.变化后:

c)平衡二叉树插入、删除操作的具体实现

i.插入操作各种可能的情况

1.LL的情况:

由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1增至2

文档评论(0)

151****1215 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档