红黑树C语言实现--源于算法导论

一、概念

红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是RED或BLACK。通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长2倍,因而是近似于平衡的。

二、定义

一棵红黑树是满足下面红黑性质的二叉搜索树:

1、每个结点或是红色,或是黑色;

2、根节点是黑色的;

3、每个叶节点(NIL)是黑色的;

4、如果一个结点是红色的,则它的两个子结点都是黑色的;

5、对每个结点,从该结点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点(此黑色结点的数目称为黑高)。

三、和平衡二叉树的区别

平衡二叉树是完全平衡的,而红黑树是局部平衡的,能确保没有一条路径会比其他路径长2倍,并且调整少,性能高,所以得到广泛应用,在STL里map和set都由红黑树实现。

四、节点定义

enum node_color{RED,BLACK};
typedef struct RBnode
{
    int key;//数据信息
    struct RBnode *left;//左孩子
    struct RBnode *right;//右孩子
    struct RBnode *p;//父节点
    enum node_color color;//结点颜色
}

五、示例(图中所有空指针指向叶结点NIL)

六、旋转

目的:对红黑树进行插入和删除,可能会导致该树不在满足红黑树的性质,为了维护红黑树的性质,必须要改变树中某些结点的颜色以及指针结构。改变指针结构即通过旋转来完成,这是一种能保持二叉搜索树性质的搜索树局部操作。

1、左旋(LEFT_ROTATE)

图示:由三部完成该操作。

代码:

//将结点x左旋
RBnode *LEFT_ROTATE(RBnode *T, RBnode *x)
{
    RBnode *y;

    y=x->right;//set y

    //step1:tunrn y's left subtree into x's right subtree
    x->right=y->left;
    if(y->left!=NIL)
        y->left->p=x;

    //step2:link x's parent to y
    y->p=x->p;
    if(x->p==NIL)
        T=y;
    else if(x==x->p->left)
        x->p->left=y;
    else
        x->p->right=y;

    //step3:put x on y's left
    y->left=x;
    x->p=y;

    return T;
}

2、右旋(LEFT_ROTATE)

图示:由三部完成该操作。

代码:

//将结点x右旋
RBnode *RIGHT_ROTATE(RBnode *T, RBnode *x)
{
    RBnode *y;

    y=x->p;//set y

    //step1:tunrn x's right subtree into y's left subtree
    y->left=x->right;
    if(x->right!=NIL)
       x->right->p=y;

    //step2:link y's parent to x
    x->p=y->p;
    if(y->p==NIL)
        T=x;
    else if(y==y->p->left)
        y->p->left=x;
    else
        y->p->right=x;

    //step3:put y on x's right
    x->right=y;
    y->p=x;

    return T;
}

七、插入

插入操作与上一篇博文二叉排序树插入操作基本相同,除了细节之处稍有改变。

代码:

//在红黑树T上插入结点z
RBnode *RB_INSERT(RBnode *T, RBnode *z)
{
    RBnode *x;
    RBnode *y;

    y=NIL;
    x=T;
    while(x!=NIL)
    {
        y=x;
        if(z->key < x->key)
            x=x->left;
        else
            x=x->right;
    }
    z.p=y;
    if(y==NIL)
        T=z;
    else if(z->key < y->key)
        y->left=z;
    else
        y->right=z;
    z->left=NIL;
    z->right=NIL;
    z->color=RED;
    RB_INSERT_FIXUP(T,z);
}

八、染色和调整

由于插入操作可能破坏红黑树性质,通过RB_INSERT_FIXUP(T,z)函数调整结点颜色和树的结构,使其保持红黑性质。——明晚继续完善

时间: 2024-10-04 06:03:16

红黑树C语言实现--源于算法导论的相关文章

红黑树(一)之 原理和算法详细介绍---转帖

目录1 红黑树的介绍2 红黑树的应用3 红黑树的时间复杂度和相关证明4 红黑树的基本操作(一) 左旋和右旋5 红黑树的基本操作(二) 添加6 红黑树的基本操作(三) 删除 作者:Sky Wang    于 2013-08-08 概述:R-B Tree,又称为"红黑树".本文参考了<算法导论>中红黑树相关知识,加之自己的理解,然后以图文的形式对红黑树进行说明.本文的主要内容包括:红黑树的特性,红黑树的时间复杂度和它的证明,红黑树的左旋.右旋.插入.删除等操作. 请尊重版权,转

红黑树(一)之 原理和算法

R-B Tree简介 Red-Black Tree,是一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,即红(Red)或黑(Black). 红黑树的特性:(1)每个节点是黑或红.(2)根节点是黑色.(3)每个叶子节点(NIL)是黑色. [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!](4)如果一个节点是红色的,则它的子节点必须是黑色的.(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点. 注意:(01) 特性(3)中的叶子节点,是只为空(NIL或n

算法导论-------------红黑树

红黑树是一种二叉查找树,但在每个结点上增加了一个存储位表示结点的颜色,可以是RED或者BLACK.通过对任何一条从根到叶子的路径上各个着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的.本章主要介绍了红黑树的性质.左右旋转.插入和删除.重点分析了在红黑树中插入和删除元素的过程,分情况进行详细讨论.一棵高度为h的二叉查找树可以实现任何一种基本的动态集合操作,如SEARCH.PREDECESSOR.SUCCESSOR.MIMMUM.MAXMUM.INSERT.DELETE等

算法之红黑树

红黑树(一) 原理和算法详细介 1 R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为"红黑树",它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). 红黑树的特性:(1)每个节点或者是黑色,或者是红色.(2)根节点是黑色.(3)每个叶子节点(NIL)是黑色. [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!](4)如果一个节点是红色的,则它的子节点必须是黑色的.(5)从一个节点到该节点

红黑树详细介绍三

根据之前红黑树的原理和<算法导论>上面的伪代码,我用代码将增加和调整的代码实现了一下,如有不对请大家指正.代码可以结合前两篇文章看. 红黑树的详细介绍一 红黑树详细介绍二 /* * ===================================================================================== * * Filename: rbtree->h * * Description: red black tree * * Version:

【转】红黑树(一)原理与算法详细介绍

讲的通俗易懂,忍不住内心的欢喜,独乐乐不如众乐乐,下面贴出博文及地址: 概要 目录1 红黑树的介绍2 红黑树的应用3 红黑树的时间复杂度和相关证明4 红黑树的基本操作(一) 左旋和右旋5 红黑树的基本操作(二) 添加6 红黑树的基本操作(三) 删除 [转]  作者:Sky Wang :http://www.cnblogs.com/skywang12345/p/3245399.html 更多内容: 数据结构与算法系列 目录 (01) 红黑树(一)之 原理和算法详细介绍(02) 红黑树(二)之 C语

红黑树 实现

转发skywang12345 概要 前面分别介绍红黑树的理论知识.红黑树的C语言和C++的实现.本章介绍红黑树的Java实现,若读者对红黑树的理论知识不熟悉,建立先学习红黑树的理论知识,再来学习本章.还是那句老话,红黑树的C/C++/Java实现,原理一样,择其一了解即可. 目录1. 红黑树的介绍2. 红黑树的Java实现(代码说明)3. 红黑树的Java实现(完整源码)4. 红黑树的Java测试程序 转载请注明出处: 更多内容:数据结构与算法系列 目录 (01) 红黑树(一)之 原理和算法详细

红黑树与AVL树

概述:本文从排序二叉树作为引子,讲解了红黑树,最后把红黑树和AVL树做了一个比较全面的对比. 1 排序二叉树 排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索. 排序二叉树要么是一棵空二叉树,要么是具有下列性质的二叉树: ? 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值: ? 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值: ? 它的左.右子树也分别为排序二叉树. 下图显示了一棵排序二叉树: 对排序二叉树,若按中序遍历就可以得到由小到大的

红黑树探索笔记

最近花了些时间重拾数据结构的基础知识,先尝试了红黑树,花了大半个月的时间研究其原理和实现,下面是学习到的知识和一些笔记的分享.望各位多多指教.本次代码的实现请点击:红黑树实现代码 红黑树基础知识 定义 红黑树是带有color属性的二叉搜索树,color的值为红色或黑色,因此叫做红黑树. 对红黑树的每个结点的结构体定义如下: struct RBNode { int color; void *key; void *value; struct RBNode *left; struct RBNode *