红黑树简明图解

一、概念

1、红黑树。红黑树为二叉排序树,节点分红黑两色,根节点为黑色,并满足如下两个性质:

2、颜色性。沿任意路径上红色节点不能连续出现。

3、平衡性。对于任意节点x,从x出发至任一叶节点的路径上黑色节点数目相同。

4、哑元素。红黑树节点有三个指针:left、right、parent,当没有对应节点不存在时指针不为null,而是指向一个名叫NIL的哑元素。这使任意节点都有叶节点,在本文的分析中做次默认,但不会显示标注出NIL来。NIL为分析问题提供了巨大便利。

5、黑高度。从x节点至任意叶节点的路径上黑色节点的数目(不包括x)为x的黑高度,但包括x也无所谓。

二、插入

红黑树与AVL树一样把新节点x插入为一个叶节点,并将其涂为红色。

删除任意红色节点不会引起任何平衡性和颜色性问题;

插入一个红色叶节点最多x会与其父亲节点红色冲突,但不会引起平衡性问题;

插入或删除一个黑色节点都会引起平衡性失调。

平衡性失调比红色冲突繁琐的多,因此选择红色。红黑树的插入就是解决红色冲突问题,红黑树的删除就是解决平衡性失调问题。

既然插入一个红叶节点只会与父亲的红色冲突,怎么解决呢?不妨设插入节点为x,x的叔几点为uncle,解决方法如下图:


这只是父亲节点为祖父节点左孩子的情况,父亲为右孩子的情况同理。这个问题的本质是当前节点与父亲的红色冲突,所以把它叫做红父亲冲突问题。

三、删除

删除操作与AVL树一样,都是找到一个无孩子或只有一个孩子的后继节点y代为删除,y的孩子x取代了y的位置,如果y是红色不会引起两个性质的问题,如果y为黑色会引起原来通过y的路径(即现在通过x的路径)黑高度少了1,y的父节点(现为x的父节点)平衡性出了问题。设父节点为p,兄弟节点为bro,解决方法如下图:


上图只是解决x为左孩子的问题,x为有孩子的情况同理。这个问题的本质就是x子树的高度少了1,所以把它叫做高度缺失问题。

上图中黑色红色都是黑红节点,白节点是无法知其颜色的节点,在最后一栏还有两个蓝节点,也是颜色未知的节点,与白色不同的是这里表达了“bro变为p的颜色”这个意思,与其他的颜色转换并无不同。本文中节点的着色都是严格的,每个节点的着色都可以简单推理出来,就不写了。

可以看到在调整时分那么多情况更多是为了达到“bro右孩子为红色”那一栏的效果,因为在那一栏中问题得到了最直接的解决。

四、分析

在眼花缭乱的操作中可能不容易看清到底怎么回事,假设节点x的黑高度(包含x自身)为height(x),这里用一个例子简单说明:


操作:改变ac颜色并左旋a。子树123456的根节点不妨就用123456来表示。

子树bde本身没有改变,所以其内部没有发生颜色冲突或失去平衡的问题,节点abcde也都没有颜色冲突的问题。

操作前,height(c)=height(d)=height(b),height(1)=height(6),整个子树的黑高度为height(6)+2。

操作后,bde平衡,height(d)=height(b)未变所以a节点仍平衡,height(a)=height(1)+1=height(6)+1=height(e),所以c节点仍平衡,整棵子树黑高度为height(6)+2未变所以祖先节点也没有发生平衡性的问题。

所以这次操作是合法的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值