- 1、本文档共36页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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新的平衡
您可能关注的文档
最近下载
- 教学课件 园林苗木生产与经营.ppt
- 数字万用表-(34450A)-用户指南.pdf VIP
- 电路基础:三相电源的产生.pptx VIP
- GB50797-2012 光伏发电站设计规范.pdf VIP
- 煤矿避难硐室使用方法及注意事项.pptx VIP
- 项目进度计划的作用.docx VIP
- 四川省成都市新都区新都一中学实验学校2024−2025学年上学期新七年级分班(奖学金)模拟 数学提高试题(含解析).docx VIP
- 纪检监察审查调查工作实务.pptx VIP
- 拆除旧设备施工工艺.docx VIP
- 2025福建福州首邑产业投资集团有限公司(第一次)招聘18人笔试参考题库附答案解析.docx VIP
文档评论(0)