红黑树简介
红黑树要求:
1.列表项结点是红色或黑色。
2.根是黑色。
3.所有叶子都是黑色(叶子是NIL结点)。
4.每个红色结点必须有两个黑色的子结点。(从每个叶子到根的所有路径上不能有两个连续的红色结点。)
5.从任一结点到其每个叶子的所有简单路径都包含相同数目的黑色结点。
6.为了便于处理红黑树中的边界情况,使用一个哨兵来代表所有的NIL结点,也就是说所有指向NIL的指针都指向哨兵T.nil。
红黑树大概原理:
1.首先,他通过保持黑高度相同,保证了高度差不会超过两倍。
2.红黑树产生的原理,是产生于234树,如果不懂红黑树是为什么产生的就可以看下234树的原理
3红黑树因为不是完全平衡所以可以不用遍历到根节点,在删除上比avl树更有优势。
红黑树的优劣:
优点 :
首先他的的查找速度非常快,而且他的删除速度比avl树优化很多,他在删除时最多只需要转3次就可以使树回归平衡状态,但是avl树在最坏的情况下是要一直旋转到根节点才能恢复平衡的,所以在删除操作频繁的情况下用红黑树更有利。
缺点:因为红黑树不是完全平衡的,所以在查找时还是没有avl树这种完全平衡的二叉树查找起来速度快,二叉树是一种在查找速度跟删除速度上平均了的数。
因为红黑树不用遍历到跟节点,所以红黑树我写时不是用的递归的写法,用的顺序写法,因为二叉树没用递归写法写又需要频繁访问节点的父母节点,所以这次写的红黑树程序结构体我写了个指针指向他的父母节点。
二叉树的增加
二叉树增加分为几种情况
1.父母节点是个黑色的节点,直接添加就好,不需要改动。
2.父母节点是个红色的节点。这时候就要看父母节点的兄弟节点了。
2.1 如果增加节点叔叔节点是红色的,那么将父节点跟叔叔节点同时变成黑色的同时将祖父节点变成红色·,同时将祖父节点当做添加的节点就好。
2.2 如果叔叔节点是黑色的,那么你可以通过单转跟双转来使树恢复平衡。
红黑树的删除
红黑树的删除如果抛弃递归之后你会发现比avl树简单的多。
这里使用了一个思想,首先树是有前继跟后继节点的,如果将其后继节点的数字替换那个值是不影响树的结构的。这样就好说了。我们将一个需要修改节点的值挑出来,然后检测她有几个孩子,如果有孩子就将其跟后继节点替换,如果还有就再次进行替换,直到他没有左右,孩子为止,这时在进行删除操作就简单很多了。
交换完,如果目标节点是个红色的节点,那么可以直接进行删除操作,如果是个黑色节点,就需要进行各种情况的分析。
- 首先分析它的叔叔节点是红色的情况下,因为它的叔叔节点如果是红色的,就意味着它的爷爷节点跟兄弟节点的孩子都是黑色的,这时候就要通过以下旋转将该情况修改成别的情况,按别的情况处理。
- 它的兄弟节点跟兄弟节点的孩子全是黑色的,这种时候首先将它的兄弟节点变为黑色,然后看爷爷节点的颜色,如果爷爷节点是红色,那么变成黑色就完成,如果爷爷节点是黑色,那么将爷爷节点当做新的删除节点继续进行操作。
- 如果兄弟节点的同方向孩子是红色的
- 如果兄弟不同方向孩子是红色的