数据结构算法-1.1.1 红黑树与二叉树

Posted Soaring2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构算法-1.1.1 红黑树与二叉树相关的知识,希望对你有一定的参考价值。

1.红黑树应用的场景

1.1map-红黑树的封装

1.2nginx-》中的一点

1.3定时器-

1.4进程调度cfs  进程调度期间 进程集合存储  期间用红黑树进行查找  快且顺序

1.5 内存管理-内存分配时使用红黑树存储 

2红黑树使用的两种情况

2.1做key,value 通过key 做value的查找

2.2利用红黑树的的中序遍历查找 中序遍历是顺序的  

3红黑树实现

3.1 红黑树性质

(1)每个节点是红或是黑的(两类是非)

(2)根节点是黑的

(3)每个叶子节点是黑的

(4)如果一个节点是红色的,则他的两个儿子是黑色的,红黑树中不能有相邻的两个红色节点

(5)对每个结点,从该节点到其子孙结点的所有路径上的包含相同数目的黑节点。

3.2红黑树C实现

typedef int KEY_TYPE;

tyoedef struct _rbtree_node{

unsigned char color;

struct _retree_node *left;

struct _retree_node *right;

struct _rbtree_node *parent

KEY_TYPE   key;

void *value;

}rbtree_node;

typedef  struct rbtree{

 rbtree_node *root;

rbtree_mode *nil;

};

红黑树旋转

void _left_rotate(rbtree *T,rbtree_node *x){

       rbtree_node *y = x->right;//

         x->right = y->left;

if(y->lift != t->nil)

{

y->left->parent=x;

}

y->parent = x->parent;

if(x->parent== t->nil){

t->root=y;

}

else if(x == x-> parent->left)

{

x->parent->left=y;

}

else

{

x->parent->right=y;

}

y->left=x;

x->parent=y;

}//endleft_rotate?

void _right_rotate(rbtree *x,rbtree_node *y)

{

}

插入 没有相同的插到叶子节点

insert

typedef int KEY_TYPE;

typedef struct _rbtree_node{

    unsigned char color;

    struct _rbtree_node *left;

    struct _rbtree_node *right;

    struct _rbtree_node *parent;

    KEY_TYPE   key;

    void *value;

}rbtree_node;

typedef  struct rbtree{

    rbtree_node *root;

    rbtree_node *nil;

};
#define  RED   0
#define  BLACK 1
void rbtree_fix_up(rbtree *T,rbtree_node *z)
{
    while (z->parent->color == RED)
    {
        if (z->parent == z->parent->parent->left)
        {
            rbtree_node *y = z->parent->parent->right;
            if (y->color ==RED)
            {
                z->parent->color = BLACK;
                y->color = BLACK;
                z->parent->parent->color= RED;
                
                z= z->parent->parent;
            }
            else
            {
               if (z == z->parent->right)
               {
                   z = z->parent;
                   rb_left(T,z);
               }
               z->parent ->color =BLACK;
               z->parent->parent ->color = RED;
               _rb_right(T,z->parent->parent);
            }
        }
    }
    T->root->color=BLACK;

}
void  rbtree_insert(rbtree *T, rbtree_node *z)
{
    rbtree_node *x = T->root;
    rbtree_node *y = T->nil;
    while (x != T->nil)
    {
        y = x;
        if (z-> key < x-> key)
        {
            x=x->left;
        }
        else if (z-> key>x-> key)
        {
            x=x->right;
        }
        else
        {
            return;
        }
    }
    z->parent=y;
    if (y== T->nil)
    {
        T->root=z;
    
    }
    else if(z-> key< y-> key)
    (
        y->left = z;
    )
    else 
    {
       y->right = z;
    }
    z->left =T-> nil;
    z->right = T->nil;
    z->color = RED;
    rbtree_fix_up(T,z);
}
 

以上是关于数据结构算法-1.1.1 红黑树与二叉树的主要内容,如果未能解决你的问题,请参考以下文章

数据结构算法-1.1.1 红黑树与二叉树

C语言的世界-树与二叉树

数据结构——树与二叉树的遍历

考研数据结构与算法树与二叉树

普通树与二叉树

(王道408考研数据结构)第五章树-第三节4:树与二叉树的转换