红黑树的概念回顾
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red(红色)或Black(黑色)。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。(平衡的概念可参考AVL树,AVL树是一个高度平衡二叉搜索树,其左右子树的高度差不超过1)
见图
引发的疑问:
如何保证没有一条路径会比其他路径长出俩倍呢?只需满足红黑树的性质便可保证
红黑树的性质
- 每个结点不是红色就是黑色
- 根节点是黑色的
- 如果一个节点是红色的,则它的两个孩子结点是黑色的(即树中没有连续的红节点)
- 对于每个结点,从该结点到其所有后代空结点的简单路径上,均包含相同数目的黑色结点
特别提醒:
关于空节点有多种处理方式,有的将其称呼为外部节点,有的将其命名为叶子节点
这里还是称其为空节点。
关于路径数量的统计:
NIL表示空节点,从根节点开始到其所有后代空结点一共有12条路径(这里画上空节点只是为了
方便计算路径,没有其它含义)
红黑树的模拟实现
1、颜色的实现
根据性质1,红黑树中节点要么是黑的要么是红的,因此这里使用枚举来表示颜色
根据枚举的性质,BLACK==0,RED==1。
2、定义节点结构
键值对
键值对的意思是一个K对于一个V,这里用pair<K,V>定义出一个对象_kv,那么如何通过_kv取出K,以及对应的V呢,