JAVA 红黑树

红黑树的性质

1 每个节点不是黑色的就是红色的
2 根节点是黑色
3 从根节点出发到每个叶节点的路径上所有黑色节点的数量相等
4 每个NULL节点看成黑色的节点
5 红色节点的两个子节点都是黑色的

为什么需要红黑树

已经有了AVL平衡树,为什么还需要设计出一个红黑树。
因为红黑插入比AVL快,快的原因是,它可能会比AVL树多一层,所以需要的处理就少一些,但是它查找可能要比AVL多一次搜索过程。

红黑树的插入

前提:插入的节点都是红色的节点。如果父节点是黑色的,直接插入成功。其余的分以下几种情况

第一种情况

父节点是红色的,叔父节点也是红色的,这种情况不需要区分,当前节点是父节点的左节点还是右节点,处理逻辑是一样的。

如上图,我们插入一个节点33, 违背规则5,将父节点与叔父节点涂黑,之后违背规则3,将祖父节点涂红,结果如下图

这个时候进入第二种情况

第二种情况

父节点是红色的,叔父节点是黑色的,这里又有两种情况,分父节点是祖父节点的左节点还是右节点。

父节点是祖父节点的左节点。

这里又分2种情况,当前节点是父节点的左节点和右节点。

当前节点是父节点的右子节点

这种情况需要旋转,与AVL树的旋是一样的。 以父节点30为顶端,进行左旋,左旋后的结果如下图:

当前节点是父节点的左子节点

这个时候以当前节点30的祖父节点为顶端,进行右旋。旋转前,需要将祖父节点67涂红,父节点40涂黑,以符合规则3。

父节点是祖父节点的右节点。

不讨论这种情况,与上面是对称的。

红黑树的删除

删除的情况最多三次可以平衡,如果删除的是红色节点,直接完成删除动作,其它分以下几种情况

当前节点是黑色

如下图:

当删除节点30的时候,先找30的后继(注意还有前驱的概念)节点,然后用后继节点替换掉30节点,如下图:

用X代替30,X是空节点,这里又分2种情况,X是父节点的左节点还是右节点,我们这里只讨论右节点的情况,左节点是对称的。 将X的兄弟节点涂黑,X的父节点涂红,以X的父节点为顶端进行右旋,结果如下图:

设Y为X的兄弟节点,这个时侯有以下三种情况:

Y的左右子节点都为黑色

这个时候只需要将Y涂为红色,X的父节点涂为黑色。

Y的右节点为红色

这个时侯需要旋转,将Y的右节点变为黑色,原因是Y本身也是红色,最终肯定是需要右旋的,这个时候Y的右节点会变为Y的父节点的左节点,会造成红红冲空。 将25涂红,26涂黑,以25为顶端进行左旋:如下图:

进入Y的左节点为红色的情况

Y的左节点为红色

将Y的左节点25涂黑,Y26涂红,X的父节点40涂黑,右旋,如下图:

转载于:https://my.oschina.net/u/3217171/blog/3022812

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值