红黑树的插入与删除 详细整理资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
红黑树的插入、删除及旋转原则
Category: Uncategorized— wuxicn @ 12:29 AM
红黑树(Red-Black Tree)的插入和删除操作很繁琐,一不小心就容易弄错,不能靠强制记忆。因此,今天总结一下红黑树插入和删除操作的推导原则,包括旋转的推导原则。
本文所有内容来自三个网页
1./c?m=9d78d513d9d446db4fece4690a62c067691f976
34d8b8d5068d4e20ace3f07070671e3ca617f0704a299213156b8492dacad21724 65377a09bb9db1b9bfcc17671c33034014ad11f45954ef9df01659f2fca1cafed0 ee6c9ed2fccfd8f8b840b009759127af7a0d50755448d2ee71446b2fbc6554b024 5fbf03161fb5b7122952957b630a3a66d30&p=8f36da5986cc46aa19be9b7a7f0a &user=baidu
2.http://icoder.me/2009/08/25/insert-delete-in-red-black-tree/
3./20065562/blog/item/93b2d17fd6f391320dd7da4
4.ht
ml
如果大家能打开上面的链接,就不用再看了,我整理得不好。。
先是比较简单的插入操作的推导原则:
1. 红黑树的插入和普通搜索二叉树(Binary Search Tree)的插入一样,只是在插入完以后,将新插入的节点标记为红色,然后从该节点开始,向上进行调整颜色。
2. 向上调整颜色进行旋转时,旋转的原则是尽量用1次或者最多2次旋转完成,并且旋转操作不能影响该层以下层次的节点,只能影响其父节点,然后将其父节点(或者叔节点、兄弟节点)作为新的要调整颜色节点,继续向上递推调整。
3. 调整完后注意检查根的颜色是否还是黑色。
删除操作的推导原则:(比较麻烦!)
1. 删除节点z时,先找到z的中根后继节点y,然后将y的数据复制给z(不包
括颜色),然后将y删除。这样,删除y的时候,y最多只有一个孩子节点x,将x取代y即可,然后如果y的颜色是黑色,才需要调整颜色。若要调整颜色,从x处开始向上递推的调整颜色。
2. 从x处开始向上调整颜色时也应注意不要影响该层次以下的节点,只能影响
x同层或者更高层的节点。调整完后x的父节点(或者叔节点、兄弟节点)作为新的待调节点(新的x),如果new x颜色为红色时,则不用调了,直接结束。
3. 调整是应注意通过标记各层高度(黑高度)来进行推导。
4. 结束后看x是否是红色,如果是,改成黑色。
Remarks:
1. 里面提到的高度是指黑节点个数。
2. 层次也是关于黑节点来说的。
红黑树原理详解上:
前言:
之所以要写这篇文章,第一个目的是为了各位朋友在查看我写的源代码之前有一个可以理解理论的文章因为红黑树还是有点难的,
如果不想搞懂理论,而直接看代码,那绝对是云里雾里,不知所云。第二个目的是我觉得网上虽然后不少我文章也在讲,但是我就是理解
不上有点困难,在我参考了很多文章之后,认真阅读才慢慢摸透了其中的原理,所以我想用自己的方式来表达,希望有助于各位的朋友理解。
你可以在这里获得配套源代码
红黑树由来:
他是在1972年由Rudolf Bayer发明的,他称之为“对称二叉B树”,它现代的名字是Leo J. Guibas和 Robert Sedgewick 于1978
年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,
插入和删除,这里的n 是树中元素的数目。
红黑树性质:
1. 每个结点或红或黑。
2. 根结点为黑色。
3. 每个叶结点(实际上就是NULL指针)都是黑色的。
4. 如果一个结点是红色的,那么它的周边3个节点都是黑色的。
5. 对于每个结点,从该结点到其所有子孙叶结点的路径中所包含的黑色结点个数都一样。
讨论的前提:
1,我们只讨论往树的左边和从树的左边删除的情况,与之对称的情况一样。
2,假设我们要删除一个元素的方法都是采取删除后继节点,而非前驱节点。
3,NL或全黑表示黑空节点,也可以不用画出。
4,“=>”这个符号我们用来表示“变成”的意思。
一.插入
当红黑树中没有节点的时候,新节点直接涂黑就可以了。
当树中已有节点,我们就将新节点涂红,并且底下挂两个黑空节点。
1.1 新节点的父亲为黑色
这种情况最简单,只接插入将新节点可以了,不会出现红色警戒。
1.2 新节点的父亲为红色
这种情况出现红色警戒,并且通过红色的父亲,我们可以推出一定有一个黑色的父,并且父亲不可能为树根(树根必须为黑)。
这种情况需要修复。
1.2.1 新节点的叔叔是红色。(红叔)
图1.2.1-1
图1.2.1-2
注解:在这种情况下,我们可以通过这样的方式来修复红黑树的性质。因为遇到红色警戒所以我们首先可以想到的就是将父亲变成黑色,但这样祖父的左子树的黑高就增加了,为了达到祖父的平衡,我们红叔变成黑色,这样祖父就平衡了。但是整个祖父这颗树的高度增高了,所以再此将祖父的颜色变成红色来保持祖父这颗树的高度不变。因为祖父变成了红色,因此往上遍历。
方法:父=>黑;叔=>黑;祖=>红;往上遍历;
1.2.2 新节点的叔叔是黑色(黑叔)