!最小值
)!下一个节点
!上一个节点
!输出
!高度
!节点数
!验证
!获取旋转次数
树根
旋转的次数
节点数
!清除函数
$$!内部节
点插入函数
($!查询
)!最大值
!最小值
!新插入节点调整平衡
()$$!删除节点调整平衡
!自动判断类型旋转
!左旋转&&&&
!右旋转
!输出
!高度
$ !验证红黑树的合法性
"
在红黑树类中,定义了树根(root)和节点数(count),其中还记录红黑树在插入删除操
作时执行的旋转次数 rotate_times。其中核心操作有插入操作(insert),搜索操作(find),删
除操作(remove),递减操作(prev)——寻找比当前节点较小的节点,递增操作(next)——
寻找比当前节点较大的节点,最大值(maximum)和最小值(minimum)操作等。其中验证操
作(__ validate)通过递归操作红黑树,验证红黑树的三个基本颜色约束,用于操纵红黑树后验
证红黑树是否保持平衡。
由于插入和删除操作是红黑树的关键所在,下边重点介绍这两个操作。其他的操作一般通
过对树进行递归操作都可以轻松的完成,这里不再赘述。
三、红黑树的插入操作
红黑树的插入操作和查询操作有些类似,它按照二分搜索的方式递归寻找插入点。不过这
里需要考虑边界条件——当树为空时需要特殊处理(这里未采用 STL 对树根节点实现的特殊技
巧)。如果插入第一个节点,我们直接用树根记录这个节点,并设置为黑色,否则作递归查找
插入(__insert 操作)。
默认插入的节点颜色都是红色,因为插入黑色节点会破坏根路径上的黑色节点总数,但即
使如此,也会出现连续红色节点的情况。因此在一般的插入操作之后,出现红黑树约束条件不
满足的情况(称为失去平衡)时,就必须要根据当前的红黑树的情况做相应的调整