数据结构算法-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 红黑树与二叉树

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

树与二叉树

红黑树与AVL树

二叉树与红黑树

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