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

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

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

实验四 常见平衡树的实现与比较 问题描述: 代码实现红黑和AVL树 算法原理: 树的旋转知识 当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质。 ? 为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树种某些结点的颜色及指针结构,以达到对红黑树进行 插入、删除结点等操作时,红黑树依然能保持它特有的性质(如上文所述的,五点性质)。 ? 树的旋转,分为左旋和右旋,以下借助图来做形象的解释和介绍: 左旋 如上图所示: 当在某个结点pivot上,做左旋操作时,我们假设它的右孩子y不是NIL[T],pivot可以为树内任意右孩子而不是NIL[T]的结点。 左旋以pivot到y之间的链为“支轴”进行,它使y成为该孩子树新的根,而y的左孩子b则成为pivot的右孩子。 右旋右旋与左旋差不多,再此不做详细介绍。 红黑树插入、删除操作的具体实现 情况1:插入的是根结点。 原树是空树,此情况只会违反性质2。 ? 对策:直接把此结点涂为黑色。 情况2:插入的结点的父结点是黑色。 此不会违反性质2和性质4,红黑树没有被破坏。 ? 对策:什么也不做。 情况3:当前结点的父结点是红色且祖父结点的另一个子结点(叔叔结点)是红色。 此时父结点的父结点一定存在,否则插入前就已不是红黑树。 与此同时,又分为父结点是祖父结点的左子还是右子,对于对称性,我们只要解开一个方向就可以了。 在此,我们只考虑父结点为祖父左子的情况。 同时,还可以分为当前结点是其父结点的左子还是右子,但是处理方式是一样的。我们将此归为同一类。 ? 对策:将当前节点的父节点和叔叔节点涂黑,祖父结点涂红,把当前结点指向祖父节点,从新的当前节点重新开始算法。 针对情况3,变化前(图片来源:saturnman)[插入4节点]: 变化后: 对策:当前节点的父节点做为新的当前节点,以新当前节点为支点左旋。 如下图所示,变化前[插入7节点]: ? 变化后: ? ? 解法:父节点变为黑色,祖父节点变为红色,在祖父节点为支点右旋 如下图所示[插入2节点] 变化后: ? 删除操作各种可能的情况 情况1:当前节点是红色 ??? 解法,直接把当前节点染成黑色,结束。 ??? 此时红黑树性质全部恢复。 情况2:当前节点是黑色且是根节点 ??? 解法:什么都不做,结束 情况3:当前节点是黑色,且兄弟节点为红色(此时父节点和兄弟节点的子节点分为黑)。 ??? 解法:把父节点染成红色,把兄弟结点染成黑色,之后重新进入算法(我们只讨论当前节点是其父节点左孩子时的情况)。 ??? 然后,针对父节点做一次左旋。此变换后原红黑树性质5不变,而把问题转化为兄弟节点为黑色的情况。 ??????????????????? ?3.变化前: ? ?????????????????????3.变化后:? ? 情况4:当前节点是黑色,且兄弟是黑色,且兄弟节点的两个子节点全为黑色。 ????? 解法:把当前节点和兄弟节点中抽取一重黑色追加到父节点上,把父节点当成新的当前节点,重新进入算法。(此变换后性质5不变) ? ????????????????????????4.变化前 ? ??????????????????????? 4.变化后 ? 情况5:当前节点颜色是黑色,兄弟节点是黑色,兄弟的左子是红色,右子是黑色。 ??? 解法:把兄弟结点染红,兄弟左子节点染黑,之后再在兄弟节点为支点解右旋, 之后重新进入算法。此是把当前的情况转化为情况6,而性质5得以保持。 ? ??????????????????5.变化后: ? ? ? 情况6:当前节点颜色是黑色,它的兄弟节点是黑色,但是兄弟节点的右子是红色,兄弟节点左子的颜色任意。 ??? 解法:把兄弟节点染成当前节点父节点的颜色,把当前节点父节点染成黑色,兄弟节点右子染成黑色, 之后以当前节点的父节点为支点进行左旋,此时算法结束,红黑树所有性质调整正确。 ????????????????????6.变化前: ? ????????????? 6.变化后: ? 平衡二叉树插入、删除操作的具体实现 LL的情况: 由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1增至2而失去平衡。故需进行一次顺时针旋转操作。 即将A的左孩子B向右上旋转代替A作为根结点,A向右下旋转成为B的右子树的根结点。而原来B的右子树则变成A的左子树。 LR情况: RR情况: RL情况: AVL树节点的删除规则 设q为被删节点的父节点. 根据q-bf, 存在三种情况 如果q的新的bf==0, 意味着删除前==1 或者bf==-1, 此时高度减一 情况二 如果q的新的bf==1或者bf==-1, 意味着删除前==0, 左右子树高度一样 需改变父节点和其他某些祖父节点的平衡因子 情况三 如果q新的平衡

文档评论(0)

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

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

1亿VIP精品文档

相关文档