[工学]Chapter13-红黑树-Final.pptVIP

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

Chapter13 红黑树 第三组:李汶涓,刘丹琦,谢鹏飞,汪泱,牛宁宁 内容提要 一.红黑树定义 二.红黑树性质 三.红黑树旋转 四.红黑树插入 五.红黑树删除 六.红黑树应用 1、红黑树定义 Red-Black tree, 简称RB-Tree 它是在1972年由鲁道夫·贝尔发明的,他称之为“对称二叉B树”,它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的 特点:利用对树中的结点 “红黑着色”的要求,降低了平衡性的条件,达到局部平衡,有着良好的最坏情况运行时间,它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。 红黑树的定义 平衡的扩充二叉搜索树,满足下面条件: 性质1:每个结点为“黑色”或“红色” 性质2:根结点永远是“黑色”的 性质3:扩充外部叶结点都是空的“黑色”结点 性质4:“红色”结点的两个子结点都是“黑色”的,即:不允许两个连续的红色结点 性质5:对于每个结点,从该结点到其所有子孙叶结点的路径中所包含的黑色结点数量必须相同 红黑树示例 红黑树结点定义示例 typedef int key_t; typedef int data_t; typedef enum color_t { RED = 0, BLACK = 1 }color_t; 2、红黑树性质 结点的黑高bh(x):平衡性指标 从该结点到其子树中任意外部节点的任一条路径上的黑色结点的数量 不包括该结点本身,包括叶结点! 外部结点的黑高为零 根结点的黑高:树的黑高 红黑树性质 设r是红黑树的黑高,h是红黑树的高度(不包括外部结点),n是内部节点的个数 性质1:r ≤ h ≤ 2r 性质2:n ≥ 2r-1,最少是满二叉树 性质3:h ≤ 2log2(n+1) 结论: 红黑树搜索、插入、删除的时间复杂度为O(logn) 3 、红黑树的旋转 左、右旋转的图示 左旋实现的步骤 左旋图示: 步骤解释:需要变动的是3根粗链 ① y←right[x] //记录指向y节点的指针 ② right[x]←left[y], p[left[y]]←x //β连到x右 ③ p[y]←p[x], p[x]的左或右指针指向y //y连到p[x] ④ Left[y]←x, p[x]←y //x连到y左 左旋算法实现 LeftRotate(T, x) { //假定right[x] ≠ nil[T] //step ① y ← right[x]; //step ② right[x] ← left[y]; p[left[y]] ← x; //step ③ p[y] ← p[x]; if p[x]=nil[T] then //x是根 root[T] ← y; //修改树指针 else if x=left[p[x]] then left[p[x]] ← y; else right[p[x]] ← y; //step ④ left[y] ← x; p[x] ← y; } T(n)=O(1) 4 、红黑树的插入 step 1:将z节点按BST树规则插入红黑树中,z是叶子节点; step 2:将z涂红; step 3:调整使其满足红黑树的性质; 插入算法(一) RBInsert(T, z) { y ← nil[T]; //y用于记录:当前扫描节点的双亲节点 x ← root[T]; //从根开始扫描 while x ≠ nil[T] do //查找插入位置 { y ← x; if key[z] < key[x] then //z插入x的左边 x ← left[x]; else x ← right[x]; //z插入x的右边 } p[z] ← y; //y是z的双亲 if y = nil[T] then //z插入空树 root[T] ← z; //z是根 else if key[z] < key[y] then left[y] ← z; //z是y的左子插入 else right[y] ← z; //z是y的右子插入 插入算法(二) left[z] ← right[z] ← nil[T]; color[z] ← red; RBInsertFixup(T, z); } 时间:T(n)=O(logn) 调整分析(一) idea:通过旋转和改变颜色,自下而上调整(z进行上溯),使树满足红黑树; z插入后违反

文档评论(0)

jiupshaieuk12 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档