数据结构之红黑树

定义:红黑树是一颗二叉查找树,树中结点颜色或为红色或为黑色,且满足如下条件:
⑴根结点和所有外结点的颜色为黑色;
⑵根结点到任意一个外结点的路径上没有连续的两个红色结点,(若一个结点是红色,则其两个儿子结点都是黑色);
⑶根结点到任意外结点的路径上都有相同数目的黑色结点。

1:插入操作
插入操作可以概括为以下几个步骤:
⑴查找要插入的位置,时间复杂度为O(N);
⑵将新结点的颜色赋为红色;
⑶自下而上重新调整该树为红黑树。
其中,第⑵步之所以将新插入的结点颜色赋为红色,是因为:如果设为黑色,就会导致根到外结点的路径上有一条路上多一个额外的黑色结点,这是很难调整的。但是设为红色结点后,可能会导致出现两个连续红色结点的冲突,那么可以通过颜色调换和树旋转来调整。下面讨论第⑶步的细节:
设要插入的结点为N,N的父结点为P,P的父结点为G,P的兄弟结点为U。
①如果P是黑色结点,则整棵树不必调整便是红黑树;
②如果P是红色结点(P的父结点G一定是黑色结点),则插入N后,需要进行调整。调整时有一下三种情况:
⑴N的叔叔结点U是红色结点
这里写图片描述
如上图所示,将P和U调整为黑色并将G调整为红色。现在新结点N有了一个黑色的父结点P,因为通过P和U的任何路径都必定通过结点G,在这些路径上黑色结点数目没有改变。但是,红色结点G的父结点也有可能是红色的。为了解决这个问题,在结点G上递归调整颜色。
⑵N的叔叔U是黑色结点,并且N是左孩子
这里写图片描述
如上图所示,对祖父结点G进行一次右旋转;在旋转产生的树中,以前的父结点P现在是新结点N和以前祖父结点G的父结点,然后交换以前父结点P和祖父结点G的颜色。
⑶N的叔叔U是黑色结点,并且N是右孩子
这里写图片描述
如上图所示,对P进行一次左旋转调整新结点N和父结点P的角色;接着按情况⑵进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值