如果要学红黑树,那么就必须知道二叉树,毕竟红黑树本身就是一个二叉搜索树。只不过红黑树比一般的二叉搜索树更加稳定,也就是更加平衡,但是有没有AVL树那么的稳定,这换来的是红黑树比AVL数有更好的插入和删除效率,但是查找效率并没有比AVL差很多。下文我将用RBT代替红黑树。
二叉搜索树的删除
介绍RBT的删除,就先要知道二叉搜索树的删除(知道的同学可以直接跳过)。
删除分为四步:
1.找到删除点假设为X
2.找到X的代替点D,这里代替点可以有两个:一个是X左子树的最大点,也就是X左子树的最右点(也就是前驱点);另外一种就是X的右子树的最小点,也就是X的右子树的最左变点(也就是后继点)。
3.将X的值改成为代替点D。
4.如果代替点有子节点,那么,删除代替点,并用其子节点接上这个缺口;如果无子节点,则直接删除。
这里我们要删除15,那么代替点可以为16(后继)或者14(前驱)。接着我们将15的值改为代替点的值,然后删除原代替点,并用其子节点补上。好了,二叉搜索树的删除就结束了,是不是特别简单?
PS:18和19画反了。
RBT的删除概述
先来看看RBT的定义:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [这里叶子节点,是指为空NIL的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
比较重要的是4.5,BRT所做的操作很多都是为了满足4.5条属性。因此一定要记住!
RBT的删除分为两个步骤:
1.删除节点,也就是最简单的二叉搜索树的删除操作,只不过除了使用代替的值D替换被删除点的值X以外,还要保证原X点的颜色不变。
2.调整节点颜色,使得满足RBT的5个属性(主要是4,5)。
假设我们使用了后继的方法完第一步删除节点的操作。并且用D表示要删除的代替点,P表示D的Parent,S表示D的Sister,SL、SR表示LeftTree和RigthTree,DR表示D的DR。