实现源码过长,直接附链接在文章最后面,如有错误,还请不吝赐教。
由于实现的时候是先实现插入,再实现删除,而且参考的不是同一本书,导致变量设置有一些不太一样,所以两个操作demo代码是分开的,delete_demo中也包含插入操作。
基本定义及性质
- 红黑树是一种自平衡二叉查找树,其连接(边)被标记为红色或者黑色,节点的颜色与其上方的连接边(与父节点相连的边)的颜色相同,可以用于表示order为4的B树。典型的用途是实现关联数组,在C++ STL中,很多部分(包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持)。
- 红黑树必须遵循的性质如下:
- 节点是红色或黑色。
- 根节点是黑色。
- 每个叶节点(NIL节点,空节点)是黑色的。
- red condition: 每个红色节点的两个子节点都是黑色,同理,每个红色节点都存在父节点并且为黑色节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
- black condition: 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
从最后两个性质可以得到一个关键性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长(包含n个节点的红黑树的高度不大于2lgn)。结果是这个树大致上是平衡的。
显然,红黑树的遍历与查找操作与普通二叉树相同,而插入和删除操作需要一些额外操作来维持红黑树的性质。
插入操作
首先应当考虑的是插入的节点应当为红色还是黑色?假设为黑色,那么有一条路径上的黑色节点数目增加了,而其他路径维持原状,所以违反了black condition。因此所有插入的节点都应