红黑树旋转

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红黑树旋转相关的知识,希望对你有一定的参考价值。

  红黑树属于平衡二叉树,所以很多操作根二叉树是一样的。学习红黑树,首先要把二叉树理解,并能用代码实现。

  我主要讲述我是怎么写一棵红黑树的,并不做过细的解释。我们主要学习旋转,插入,删除。其他操作根二叉树是一样的。

  旋转跟插入操作,我是跟STL源码剖析学的,书上讲的很清楚,一个上午就可以理解+实现,然后下午学习删除操作,呵呵。。。删除操作书中没有介绍,我是对照算法导论里的伪代码跟在网上找的代码学的。不过有的博客里的源码有错误,建议大家先把他的代码粘下来,然后多运行两便,确定没问题后再跟他的代码学习。

  接下来讲旋转操作,旋转操作就是变换元素位置,已达到平衡的目的。

技术分享

左旋操作,这个并不难,基本理解过程就可以写出代码,要注意的是,如果1是根节点,转转之后把7设成根节点。

//左旋
//1.将x的右孩子设为y的左孩子(如果y存在左孩子,将左孩子的父亲设为x)
//2.将y的父亲设为x的父亲,将x的父亲的孩子设为y(根据x的情况,考虑左右孩子,是否是根节点)
//3.将x的父亲设为y,将y的左孩子设为x
static void left_rotate(Node * x, Tree * tree)
{
    Node * y;//y是x的右孩子

    y = x->right;
    x->right = y->left;
    if ( y->left != nil )
        y->left->parent = x;
    y->parent = x->parent;
    if ( tree->root != x )
    {
        if ( x == x->parent->left )
            x->parent->left = y;
        else
            x->parent->right = y;
    }
    else
        tree->root = y;
    y->left = x;
    x->parent = y;
}

大家可以根据自己的理解,实现代码。注意,左旋,旋转点一定要有左孩子。

右旋跟左旋操作一样,将left与right对换。这里不做介绍。

还有一种操作叫双旋,是通过左旋跟右旋来完成的。这里简单介绍一下。

技术分享

第一步,以5为旋转点,左旋。

第二步,以10为旋转点,右旋。

 

以上是关于红黑树旋转的主要内容,如果未能解决你的问题,请参考以下文章

红黑树的旋转查找和删除(附源代码)

动画红黑树,旋转的艺术

图解集合 红黑树的移除节点操作

图解集合 8 : 红黑树的移除节点操作

[转]红黑树讲解

图解集合红黑树概念红黑树的插入及旋转操作详细解读