红黑树

来源:互联网 发布:php ahp和jhp 编辑:程序博客网 时间:2024/05/29 13:25
红黑树是一个二叉搜索树,具有如下规则:
  1. 每个节点不是红色就是黑色。
  2. 根节点必须为黑色。
  3. 如果节点为红,其子节点必须为黑,父子节点不得同时为红。
  4. 任一节点至NULL(NULL为黑色)的任何路径,所含黑节点数必须相同。
根据规则4,新增节点必须为红。
根据规则3,新增节点的父节点必须为黑。
因为新增节点必须是红,那么只有在父节点不为黑的时候才需要调整,父节点为黑则无需调整。

着色法则的一个推论(证明过程未了解)是,红黑树的高度最多是2log(N+1)。因此,查找保证是一种对数的操作。

红黑树的平衡性比AVL树要弱,但红黑树通常能够导致良好的平衡状态。经验告诉我们,红黑树的搜索平均效率和AVL树几乎相等(STL源码剖析P210)。

红黑树的调整大体分三种情况,单旋转和双旋转非常类似于AVL树的旋转方法:
1、叔父节点为黑色,新节点在外侧插入。调整方法是:父节点和祖父节点单旋转并改变颜色。


2、叔父节点为黑色,新节点在内侧插入。调整方法是:先用新节点和父节点执行一次单旋转。

右图和第一种情况一样了,执行一次单旋转再变色即可。

3、叔父节点为红色,即祖父节点为黑,父节点和叔父节点为红。调整方法是:改变祖父、父、叔父颜色。 

如果节点G的父节点为红,那么使用前两种方法进行调整即可。

从上面的插入操作可以看出,不管是内侧插入还是外侧插入,只要叔父节点颜色为黑,那么执行相应的单旋转或双旋转即可。但如果叔父节点为红,则需要改变三个节点的颜色。上图中,G的父节点又有可能为红,那么就要根据G的叔父节点的颜色持续向上改变,这是自底向上的插入方法,STL中的红黑树就用了这种做法(源码剖析P225)。另外一种做法是自顶向下,在沿着路径搜寻插入点的同时,只要发现某个黑节点的两个儿子全为红,则改变颜色,从而避免了持续向上的改变,《数据结构与算法分析》中的例程就用了这种方法(P356)。
0 0