关于红黑树旋转的理解

概述

红黑树的左旋和右旋比较费解,网上很多资料说的很复杂,这里我用望文生义的思维来解释左旋和右旋。可能对搜索资料的网友有帮助。

二叉查找树的定义

二叉查找树是一棵空树,或者是具有下列性质的二叉树:
1、若左子树不空,则左子树上所有节点的值均小于它的根节点的值;
2、若右子树不空,则右子树上所有节点的值均大于它的根节点的值;
3、左、右子树也分别为二叉排序树;
4、没有键值相等的节点。

红黑树的定义

什么是红黑树?

红黑树(英语:Red–black tree)是一种不平衡二叉查找树,
无需保证左右子树高度差小于等于1。

是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。
它在1972年由鲁道夫·贝尔发明,被称为"对称二叉B树",
它现代的名字源于Leo J.Guibas和RobertSedgewick于1978年写的一篇论文。
红黑树的结构复杂,但它的操作有着良好的最坏情况运行时间,
并且在实践中高效:它可以在O(logN)时间内完成查找,插入和删除,
这里的n是树中元素的数目。

红黑树的特性

红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。
在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

1、节点是红色或黑色。
2、根是黑色。
3、所有叶子都是黑色(叶子是NIL节点)。
4、每个红色节点必须有两个黑色的子节点。(从叶子到根之间不能有两个连续红色节点)
5、从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

image

这些约束确保了红黑树的关键特性:
从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。

旋转

左旋

左旋图解(x左边节点逆时针旋转):
         a                
        / \                               
       b   x      ->        x
          / \              / \
         c   d            a   d
                         / \  
                        b   c

如图以x为中心,其父节点为a,左边兄弟节点为b,左子节点为c,右子节点为d

左旋就是保证x和右子节点d不变,逆时针旋转与x节点的直接相关的左边节点,也就是a,b,c
左旋的过程是将x的父节点a,左边兄弟节点b 逆时针旋转,
原来的x左节点c被x的父节点替代,
原来x的左子节点c逆时针方向平移后变成x的原父节点a的右子节点。

 

右旋

右旋图解(x右边节点顺时针旋转):
         a            
        / \             
       x   b      ->      x  
      / \                / \                  
     d   c              d   a
                           / \
                          c   b

如图以x为中心,其父节点为a,右边兄弟节点为b,左子节点为d,右子节点为c
右旋就是保证x和左子节点d不变,顺时针旋转与x直接相关的右边节点,也就是a,b,c
右旋的过程是将x的父节点a,右边兄弟节点b,还有右子节点c顺时针旋转。
原来的x右节点c被x的父节点替代,
原来的x的右子节点c顺时针方向平移后变成x的原父节点a的左子节点。

猜你喜欢

转载自www.cnblogs.com/geektcp/p/11520014.html