1.2 红黑树 学习笔记

本文详细介绍了红黑树的原理,包括插入和删除操作的处理,以及左旋、右旋调整。提供了C语言实现红黑树的代码示例,并讨论了红黑树在Linux内核中的应用,如进程调度、虚拟内存管理和epoll。此外,还提到了nginx如何利用红黑树来优化定时器和静态文件缓存。
摘要由CSDN通过智能技术生成

未完待续...

参考:https://www.jianshu.com/p/84416644c080

参考:零声学院课程

原理

红黑树 https://en.wikipedia.org/wiki/Red%E2%80%93black_tree

左倾红黑树 https://en.wikipedia.org/wiki/Left-leaning_red%E2%80%93black_tree

 

插入的三种情况

注意需要说明的是,写代码一般是将情况三转换为情况二(以B为中心,左旋)

 

 

删除的四种情况(只涉及删除黑节点的情况,其他情况很简单的)

注意需要说明的是,写代码一般是将情况二转换为情况三(以B为中心,右旋)

 

 

代码

#include <stdio.h>
#include <stdlib.h>
//https://www.jianshu.com/p/84416644c080


// 1. 每个结点是红的或者黑的
// 2. 根结点是黑的 !!!
// 3. 每个叶子结点是黑的
// 4. 如果一个结点是红的,则它的两个儿子都是黑的 !!!
// 5. 对每个结点,从该结点到其子孙结点的所有路径上的
// 包含相同数目的黑结点

#define RED				1
#define BLACK 			2

typedef int KEY_VALUE;

#define RBTREE_ENTRY(name, type)\
    struct name{                \
        unsigned char color;    \
        struct type *left;      \
        struct type *right;     \
        struct type *parent;    \
    }

struct rbtree_node{
    RBTREE_ENTRY(,rbtree_node) rbt;

    KEY_VALUE key;
};

typedef struct{
    struct rbtree_node *root;
    struct rbtree_node *nil;
}rbtree;


rbtree* rbtree_create(){
    rbtree* T = malloc(sizeof(rbtree));
    T->nil = malloc(sizeof(struct rbtree_node));
    T->nil->rbt.color = BLACK;
    T->nil->rbt.left = T->nil;
    T->nil->rbt.right = T->nil;
    T->root = T->nil;
    return T;
}

void rbtree_left_rotate(rbtree *T,struct rbtree_node *x){
    if(x == T->nil)
        return;
    struct rbtree_node *y = x->rbt.right;
    if(y == T->nil)
        return;

    x->rbt.right = y->rbt.left;
    if(y->rbt.left != T->nil)
        y->rbt.left->rbt.parent = x;

    y->rbt.parent = x->rbt.parent;
    if(x->rbt.parent == T->nil){
        T->root = y;
    }else if(x == x->rbt.parent->rbt.left){
        x->rbt.parent->rbt.left = y;
    }else{//x == x->rbt.parent->rbt.right
        x->rbt.parent->rbt.right = y;
    }

    y->rbt.left = x;
    x->rbt.parent = y;

}


void rbtree_right_rotate(rbtree *T,struct rbtree_node *x){
    if(x == T->nil)
        return;
    struct rbtree_node *y = x->rbt.left;
    if(y == T->nil)
        return;
    
    x->rbt.left = y->rbt.right;
    if(y->rbt.right != T->nil)
        y->rbt.right->rbt.parent = x;
    

    y->rbt.parent = x->rbt.parent;
    if(x->rbt.parent == T->nil){
        T->root = y;
    }else if(x == x->rbt.parent->rbt.left){
        x->rbt.parent->rbt.left = y;
    }else{//x == x->rbt.parent->rbt.right
        x->rbt.parent->rbt.right = y;
    }

    y->rbt.right = x;
    x->rbt.parent = y;
}


void rbtree_insert_fixup(rbtree *T,struct rbtree_node *z){
    //保持z一直是RED
    while(z->rbt.parent->rbt.color == RED){
        //父在左
        if(z->rbt.parent == 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值