插入或删除操作,都有可能改变红黑树的平衡性,利用颜色变化与旋转这两大法宝就可应对所有情况,将不平衡的红黑树变为平衡的红黑树。
在进行颜色变化或旋转的时候,往往要涉及祖孙三代节点:X表示操作的基准节点,P代表X的父节点,G代表X的父节点的父节点。
我们先来大体预览一下插入的过程:
1、沿着树查找插入点,如果查找过程中发现某个黑色节点的两个子节点都是红色,则执行一次颜色变换(父节点变为红色,而两...
分类:
其他好文 时间:
2015-07-30 09:30:22
阅读次数:
143
红黑树(red-black tree)是一种“平衡”查找树,它能保证最坏情况下,基本的动态集操作时间为O(lgn).
性质:
1)每个节点要么是红的,要么是黑的
2)根节点和叶子节点(NIL)是黑色的
3)若一个节点是红色的,则他的两个孩子节点是黑色的
4)对于每一个节点x,从该节点到其子酸节点的所有路径上包含相同数目的黑节点(#black nodes = black-height(x)...
分类:
编程语言 时间:
2015-07-16 19:54:30
阅读次数:
141
在本系列的前面两篇文章中,已经介绍了红黑树以及其插入操作。具体可参考下面两个链接:
红黑树(1) - 介绍
红黑树(2) - 插入操作
1.删除操作介绍
类似于插入操作,红黑树进行删除节点时,也使用重新着色以及旋转这两种方式,来维护它的属性。在插入操作中,我们主要是依靠检测叔节点的颜色来决定哪种场景。在删除操作中,我们使用检测兄弟的颜色,来决定是哪种场景。
在插入操作中,最常见的违反...
分类:
其他好文 时间:
2015-07-12 00:22:30
阅读次数:
140
1.插入介绍
首先以二叉排序树的方法增加节点并标记它为红色。(为何不是红色?因为如果设为黑色,就会导致根到叶子的所有路径中,有一条路径上会多出一个额外的黑节点,这个是很难调整的)。但是,设为红色节点后,可能会导致出现两个连续红色节点的冲突,则可以通过重新着色和旋转来调整。具体的调整操作取决于其他临近节点的颜色。
下面分析一下插入新节点后可能对红黑树性质产生的影响:
性质1-节点是红色或黑...
分类:
其他好文 时间:
2015-07-09 06:19:47
阅读次数:
125
直接上代码:class RBTree: def __init__(self): self.nil = RBTreeNode(0) self.root = self.nilclass RBTreeNode: def __init__(self, x): ...
分类:
编程语言 时间:
2015-02-04 16:24:47
阅读次数:
422
红黑树的插入和删除规则:
红黑树的五个性质
1、 每个节点要么是红的,要么是黑的
2、 根节点时黑色的
3、 每个叶节点(叶节点既指树尾端NIL指针或NULL节点)是黑色的
4、 如果一个节点时红的,那么它的两个儿子都是黑色的
5、 对每个节点,其到叶节点树尾端NIL指针的每一条路径都包含相同数目的黑节点
这里所说的“叶节点”或者“NULL节点”,它不包...
分类:
其他好文 时间:
2015-01-28 14:44:05
阅读次数:
119
红黑树是建立在二叉查找树的基础之上的,关于二叉查找树可以参看【算法导论】二叉搜索树的插入和删除和【算法导论】二叉树的前中后序非递归遍历实现。对于高度为h的二叉查找树而言,它的SEARCH、INSERT、DELETE、MINIMUM、MAXIMUM等操作的时间复杂度均为O(h)。所以在二叉查找树的高度较高时,上述操作会比较费时,而红黑树就可以解决这种问题。...
分类:
编程语言 时间:
2015-01-14 12:49:51
阅读次数:
1480
红黑树是特殊二叉查找树的一种,一颗红黑树有以下5种性质:1、根节点为黑色。2、每个节点不是黑色就是红色。3、每个红色节点的两个儿子一定是黑色。4、所有的叶子节点都是黑色。(注:这里的叶子节点并不是真正意义上的叶子节点,而是一种只有颜色属性但不存放数据的节点,而且其没有儿子节点)5、一个红黑树的中任取...
分类:
其他好文 时间:
2014-11-03 20:36:28
阅读次数:
215