红黑树
2016-03-14 16:11
411 查看
参考:http://blog.csdn.net/spch2008/article/details/9338923
定义:
【Definition】A red-black tree is a binary search tree that satisfies the following red-black properties:
(1) Every node is either
redor black.
(2) The root is black.
(3) Every leaf (NIL) is black. (NULL in leaf is regraded as black)
(4) If a node is red,then both its children are black.
(5) For each node, all simple paths from the node to descendant leaves contain thesame number ofblack nodes.
性质:
1.BH:
【Definition】The black-height of any node x, denoted bybh(x), is the number of blacknodes on any simple path from x (x not included)
down to a leaf. bh(Tree) = bh(root).
2.
【Lemma】 A red-black tree withN internal
nodes has height at most2ln(N+1).
Proof:
操作—插入:
— can be doneiteratively Sketchof
the idea: Insert only & colorred (insert black node will break the balance)
递归的根据case1,2,3调整,如果根节点变成红色,则将根节点置为黑色
.
操作—删除:
要点:平衡状态下红黑树要么单支黑-红,要么有两个子节点。(详见下面分析)
1.有一个子节点的情况:最简单情况,即删除红色节点。删除红色节点,不影响红黑树平衡性质,如图:
只需要删除红色节点,不需要进行调整,因为不影响红黑树的性质。 黑色节点没有增多也没有减少。
注意:以下几种单支情况在平衡的红黑树中不可能出现。
因为上述的情况,红黑树处于不平衡状态。(破坏到null,黑色节点数目相同)
所以,平衡状态下红黑树要么单支黑-红,要么有两个子节点。
2.有两个子节点的情况:
若删除节点有左右两个儿子,即左右子树,需要按照二叉搜索树的删除规律,从右子树中找最小的替换删除节点(该节点至多有一个右子树)或者从左子树中找最大的替换删除节点(该节点最多有一个左子树),所以真正删除的是一个只有一个子节点或者没有子节点的替换节点。
(1) 删除操作中真正被删除的必定是只有一个红色孩子或没有孩子的结点。
(2)如果真正的删除点是一个红色结点,那么它必定是一个叶子结点。(见1中的分析)
case1:真正删除点是红色节点:若替换子节点为红色结点,则它必定是叶子结点,直接删除即可。(见1)
case2:真正删除点是黑节点,其子节点为红节点时,用其子节点树替换该节点,子节点变为黑色
若y为黑色,则删除y后,x替换了y的位置,这样x子树相对于兄弟节点w为根的子树少了一个黑节点,影响平衡,需要进行调整。调整工作就是将x子树中找一合适红色节点,将其置黑,使得x子树与w子树达到平衡。若x为红色,直接将x置为黑色,即可达到平衡。
用x子树替换y,x变为黑色
case3:真正删除点是黑节点,其子节点也是黑节点时,考虑真正删除点的兄弟节点(x为空结点时,亦属于这种情况)
法则:x为黑色节点,删除y之后,x变成z的字节点,此时x子树比其兄弟节点子树少一个黑节点(因为y被删除),我们需要根据y的兄弟节点w(此时为x的兄弟节点)来进行调整,有4种情况:
(1)兄红:x的兄弟w为红色,则w的儿子必然全黑,而且有两层,因为删除y之前,y也是黑的,所以bh(w)=2,w父亲p也为黑。因为bh(w)=2,所以交换p和w的颜色,同时对p做一次左旋,这样就将bh减少1,情况1转才能变为情况2,3,4的一种。
(2)兄子双黑:x的兄弟w为黑色,x与w的父亲颜色可红可黑。
因为x子树相对于其兄弟w子树少一个黑色节点,可以将w置为红色,这样,x子树与w子树黑色节点一致,保持了平衡。
new x为x与w的父亲。new x相对于它的兄弟节点new w少一个黑色节点。如果new x为红色,则将new x置为黑,则整棵树平衡。否则,
new x是黑色,此时其还是比new w 少一个黑色节点,所以情况2又转变为new x的情况1,2,3,4.
(3)兄子左红:
w为黑色,w左孩子红色,右孩子黑色。将红色节点变换到右子树:交换w与左孩子的颜色,对w进行右旋。转换为情况4
(4)兄子右红:w为黑色,右孩子为红色(注意此时左孩子不可能是黑色),有孩子一定会有至少一个黑色节点。
交换w与父亲p颜色,同时对p做左旋。这样左边缺失的黑色就补回来了,同时,将w的右儿子置黑,这样左右都达到平衡。(注意E至少有一个黑儿子)
总结:1.情况2是最好理解的,减少右子树的一个黑色节点,使x与w平衡,将不平衡点上移至x与w的父亲,进行下一轮迭代。2.情况1:记住,因为bh(w)=2,如果w为红色,要通过旋转,才能转成情况1,2,3进行处理。3.情况3要记住:若左边子节点红色则通过变换把红色变到右边子节点(情况3),所以情况3转换为情况4进行处理。也就是说,情况4是最接近最终解的情况。
4.情况4:右儿子是红色节点,那么将缺失的黑色交给右儿子,通过旋转,达到平衡。
3.没有子节点的情况:(1)若节点为红色,则其父节点肯定没有黑色子节点,所以其可以直接删除.
(2)若节点为黑色,则转化为2的情况,子节点x为NULL.
定义:
【Definition】A red-black tree is a binary search tree that satisfies the following red-black properties:
(1) Every node is either
redor black.
(2) The root is black.
(3) Every leaf (NIL) is black. (NULL in leaf is regraded as black)
(4) If a node is red,then both its children are black.
(5) For each node, all simple paths from the node to descendant leaves contain thesame number ofblack nodes.
性质:
1.BH:
【Definition】The black-height of any node x, denoted bybh(x), is the number of blacknodes on any simple path from x (x not included)
down to a leaf. bh(Tree) = bh(root).
2.
【Lemma】 A red-black tree withN internal
nodes has height at most2ln(N+1).
Proof:
操作—插入:
— can be doneiteratively Sketchof
the idea: Insert only & colorred (insert black node will break the balance)
递归的根据case1,2,3调整,如果根节点变成红色,则将根节点置为黑色
.
操作—删除:
要点:平衡状态下红黑树要么单支黑-红,要么有两个子节点。(详见下面分析)
1.有一个子节点的情况:最简单情况,即删除红色节点。删除红色节点,不影响红黑树平衡性质,如图:
只需要删除红色节点,不需要进行调整,因为不影响红黑树的性质。 黑色节点没有增多也没有减少。
注意:以下几种单支情况在平衡的红黑树中不可能出现。
因为上述的情况,红黑树处于不平衡状态。(破坏到null,黑色节点数目相同)
所以,平衡状态下红黑树要么单支黑-红,要么有两个子节点。
2.有两个子节点的情况:
若删除节点有左右两个儿子,即左右子树,需要按照二叉搜索树的删除规律,从右子树中找最小的替换删除节点(该节点至多有一个右子树)或者从左子树中找最大的替换删除节点(该节点最多有一个左子树),所以真正删除的是一个只有一个子节点或者没有子节点的替换节点。
(1) 删除操作中真正被删除的必定是只有一个红色孩子或没有孩子的结点。
(2)如果真正的删除点是一个红色结点,那么它必定是一个叶子结点。(见1中的分析)
case1:真正删除点是红色节点:若替换子节点为红色结点,则它必定是叶子结点,直接删除即可。(见1)
case2:真正删除点是黑节点,其子节点为红节点时,用其子节点树替换该节点,子节点变为黑色
若y为黑色,则删除y后,x替换了y的位置,这样x子树相对于兄弟节点w为根的子树少了一个黑节点,影响平衡,需要进行调整。调整工作就是将x子树中找一合适红色节点,将其置黑,使得x子树与w子树达到平衡。若x为红色,直接将x置为黑色,即可达到平衡。
用x子树替换y,x变为黑色
case3:真正删除点是黑节点,其子节点也是黑节点时,考虑真正删除点的兄弟节点(x为空结点时,亦属于这种情况)
法则:x为黑色节点,删除y之后,x变成z的字节点,此时x子树比其兄弟节点子树少一个黑节点(因为y被删除),我们需要根据y的兄弟节点w(此时为x的兄弟节点)来进行调整,有4种情况:
(1)兄红:x的兄弟w为红色,则w的儿子必然全黑,而且有两层,因为删除y之前,y也是黑的,所以bh(w)=2,w父亲p也为黑。因为bh(w)=2,所以交换p和w的颜色,同时对p做一次左旋,这样就将bh减少1,情况1转才能变为情况2,3,4的一种。
(2)兄子双黑:x的兄弟w为黑色,x与w的父亲颜色可红可黑。
因为x子树相对于其兄弟w子树少一个黑色节点,可以将w置为红色,这样,x子树与w子树黑色节点一致,保持了平衡。
new x为x与w的父亲。new x相对于它的兄弟节点new w少一个黑色节点。如果new x为红色,则将new x置为黑,则整棵树平衡。否则,
new x是黑色,此时其还是比new w 少一个黑色节点,所以情况2又转变为new x的情况1,2,3,4.
(3)兄子左红:
w为黑色,w左孩子红色,右孩子黑色。将红色节点变换到右子树:交换w与左孩子的颜色,对w进行右旋。转换为情况4
(4)兄子右红:w为黑色,右孩子为红色(注意此时左孩子不可能是黑色),有孩子一定会有至少一个黑色节点。
交换w与父亲p颜色,同时对p做左旋。这样左边缺失的黑色就补回来了,同时,将w的右儿子置黑,这样左右都达到平衡。(注意E至少有一个黑儿子)
总结:1.情况2是最好理解的,减少右子树的一个黑色节点,使x与w平衡,将不平衡点上移至x与w的父亲,进行下一轮迭代。2.情况1:记住,因为bh(w)=2,如果w为红色,要通过旋转,才能转成情况1,2,3进行处理。3.情况3要记住:若左边子节点红色则通过变换把红色变到右边子节点(情况3),所以情况3转换为情况4进行处理。也就是说,情况4是最接近最终解的情况。
4.情况4:右儿子是红色节点,那么将缺失的黑色交给右儿子,通过旋转,达到平衡。
3.没有子节点的情况:(1)若节点为红色,则其父节点肯定没有黑色子节点,所以其可以直接删除.
(2)若节点为黑色,则转化为2的情况,子节点x为NULL.
相关文章推荐
- Kotlin For Android初体验——配置Kotlin
- 男怕入错行 完美池宇峰畅谈创业点滴
- 我想创业,但不懂技术怎么办
- Google 绘图(mapping)
- 不是技术牛人,如何拿到国内巨头Offer
- 乔布斯:关于Flash的几点看法
- AS3多种天气预报调用代码分享
- Flash加载ini文件!
- 大量实用工具类、开源包
- 我已率先抢占昵称,我的昵称独一无…
- 欢迎您在新浪博客安家
- pitch yaw roll是什么
- OpenGL学习日记1状态管理和绘制几何物体
- Openstack Generate image
- Flask 框架学习(三)
- 微软“WebDAV”提权漏洞(cve-2016-0051)初探
- 创建数据库并设置编码
- ubuntu12.04软件中心打开错误和 ubuntu 包管理之“:E: 读错误 - read (5: 输入/输出错误) E: 无法解析或打开软件包的列表或是状态文件。”的解决
- jquery获取复选框checkbox的值
- visual studio code(vscode) 调试php