亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言實現紅黑樹的實例代碼

2020-01-26 15:40:00
字體:
來源:轉載
供稿:網友

因為看內核的時候感覺紅黑樹挺有意思的,所以利用周末的時間來實現一下玩玩。紅黑樹的操作主要是插入和刪除,而刪除的時候需要考慮的情況更多一些。具體的操作就不在這里羅嗦了,百度文庫里面有一個比較有好的文章,已經說的很明白了。

在看具體的操作的時候有的人可能感覺有些情況是沒有考慮到的(如果沒有這種感覺的人很有可能根本沒有仔細地想)。但是那些“遺漏”的情況如果存在的話,操作之前的紅黑樹將違反那幾個規則。

寫代碼的時候很多次因為少考慮情況而導致錯誤,細節比較多,剛開始rb_node中沒有指向父節點的指針,寫的快吐血,然后還是加上了。代碼具體的含義可以結合文章和注釋來看(還是很好理解的)。下面的代碼中可能還有沒有考慮到的細節,歡迎拍磚。

復制代碼 代碼如下:

#include <stdio.h>
#include <stdlib.h>

const int RED = 0;
const int BLACK = 1;

struct rb_node{
    rb_node* lchild, *rchild, *parent;
    int key, colour;
};
rb_node* root;

rb_node* get_node(rb_node* parent, int key);
void rb_insert(int key);
rb_node* rb_search(int key);
void rb_delete(int key);
rb_node* clock_wise(rb_node* node);
rb_node* counter_clock_wise(rb_node* node);
void show_rb_tree(rb_node* node);

rb_node* get_node(rb_node* parent, int key){
    rb_node *tmp = (rb_node*)malloc(sizeof(rb_node));
    tmp->key = key;
    tmp->colour = RED;
    tmp->parent = parent;
    tmp->lchild = tmp->rchild = NULL;
    return tmp;
}

rb_node* clock_wise(rb_node* node){
    if(node == NULL || node->lchild == NULL)
    return NULL;

    rb_node *rb_1=node, *rb_2=node->lchild, *rb_3=node->lchild->rchild;
    if(rb_1->parent != NULL){
    if(rb_1->parent->lchild == rb_1)
        rb_1->parent->lchild = rb_2;
    else
        rb_1->parent->rchild = rb_2;
    }else if(rb_1 == root){
    root = rb_2;
    }
    rb_2->parent = rb_1->parent;

    rb_1->parent = rb_2;
    rb_2->rchild = rb_1;

    rb_1->lchild = rb_3;
    if(rb_3 != NULL)rb_3->parent = rb_1;

    return rb_2;   
}

rb_node* counter_clock_wise(rb_node* node){
    if(node == NULL || node->rchild == NULL)
    return NULL;

    rb_node *rb_1=node, *rb_2=node->rchild, *rb_3=node->rchild->lchild;
    if(rb_1->parent != NULL){
    if(rb_1->parent->lchild == rb_1)
        rb_1->parent->lchild = rb_2;
    else
        rb_1->parent->rchild = rb_2;
    }
    else if(rb_1 == root){
    root = rb_2;
    }
    rb_2->parent = rb_1->parent;

    rb_1->parent = rb_2;
    rb_2->lchild = rb_1;

    rb_1->rchild = rb_3;
    if(rb_3 != NULL)rb_3->parent = rb_1;

    return rb_2;
}

rb_node* rb_search(int key){
    rb_node *p = root;
    while(p != NULL){
    if(key < p->key)
        p = p->lchild;
    else if(key > p->key)
        p = p->rchild;
    else
        break;
    }
    return p;
}

void rb_insert(int key){
    rb_node *p=root, *q=NULL;

    if(root == NULL){
    root = get_node(NULL, key);
    root->colour = BLACK;
    return;
    }

    while(p != NULL){
    q = p;
    if(key < p->key)
        p = p->lchild;
    else if(key > p->key)
        p = p->rchild;
    else return;
    }

    if(key < q->key)
    q->lchild = get_node(q, key);
    else
    q->rchild = get_node(q, key);

    while(q != NULL && q->colour == RED){
    p = q->parent;//p won't null, or BUG.

    if(p->lchild == q){
        if(q->rchild != NULL && q->rchild->colour == RED)
        counter_clock_wise(q);       
        q = clock_wise(p);
        q->lchild->colour = BLACK;
    }
    else{
        if(q->lchild != NULL && q->lchild->colour == RED)
        clock_wise(q);
        q = counter_clock_wise(p);
        q->rchild->colour = BLACK;
    }

    q = q->parent;
    }
    root->colour = BLACK;
}

void show_rb_tree(rb_node* node){
    if(node == NULL)
    return;
    printf("(%d,%d)/n", node->key, node->colour);
    if(node->lchild != NULL){
    printf("[-1]/n");
    show_rb_tree(node->lchild);
    }
    if(node->rchild != NULL){
    printf("[1]/n");
    show_rb_tree(node->rchild);
    }
    printf("[0]/n");
}

void rb_delete(int key){
    rb_node *v = rb_search(key), *u, *p, *c, *b;
    int tmp;
    if(v == NULL) return;

    u = v;
    if(v->lchild != NULL && v->rchild != NULL){
    u = v->rchild;
    while(u->lchild != NULL){
        u = u->lchild;
    }
    tmp = u->key;
    u->key = v->key;
    v->key = tmp;
    }

    //u is the node to free.
    if(u->lchild != NULL)
    c = u->lchild;
    else
    c = u->rchild;

    p = u->parent;
    if(p != NULL){
    //remove u from rb_tree.
    if(p->lchild == u)
        p->lchild = c;
    else
        p->rchild = c;
    }
    else{
    //u is root.
    root = c;
    free((void*)u);
    return;
    }

    //u is not root and u is RED, this will not unbalance.
    if(u->colour == RED){
    free((void*)u);
    return;
    }

    free((void*)u);
    u = c;

    //u is the first node to balance.
    while(u != root){
    if(u != NULL && u->colour == RED){
        //if u is RED, change it to BLACK can finsh.
        u->colour = BLACK;
        return;
    }

    if(u == p->lchild)
        b = p->rchild;
    else
        b = p->lchild;

    printf("%d/n", b->key);

    //b is borther of u. b can't be null, or the rb_tree is must not balance.
    if(b->colour == BLACK){
        //If b's son is RED, rotate the node.
        if(b->lchild != NULL && b->lchild->colour == RED){
        if(u == p->lchild){
            b = clock_wise(b);
            b->colour = BLACK;
            b->rchild->colour = RED;

            p = counter_clock_wise(p);
            p->colour = p->lchild->colour;
            p->lchild->colour = BLACK;
            p->rchild->colour = BLACK;
        }
        else{
            p = clock_wise(p);
            p->colour = p->rchild->colour;
            p->rchild->colour = BLACK;
            p->lchild->colour = BLACK;
        }

        return;
        }
        else if(b->rchild != NULL && b->rchild->colour == RED){
        if(u == p->rchild){
            b = counter_clock_wise(b);
            b->colour = BLACK;
            b->lchild->colour = RED;

            p = clock_wise(p);
            p->colour = p->rchild->colour;
            p->rchild->colour = BLACK;
            p->lchild->colour = BLACK;
        }
        else{
            p = counter_clock_wise(p);
            p->colour = p->lchild->colour;
            p->lchild->colour = BLACK;
            p->rchild->colour = BLACK;
        }       
        return;
        }
        else{//if b's sons are BLACK, make b RED and move up u.
        b->colour = RED;
        u = p;
        p = u->parent;
        continue;
        }
    }
    else{
        if(u == p->lchild){
        p = counter_clock_wise(p);
        p->colour = BLACK;
        p->lchild->colour = RED;
        p = p->lchild;
        }
        else{
        p = clock_wise(p);
        p->colour = BLACK;
        p->rchild->colour = RED;
        p = p->rchild;
        }
    }
    }
    root->colour = BLACK;
}

int main(){
    int i;
    root = NULL;
    for(i = 1; i <= 10; i++){   
    rb_insert(i);
    }
    rb_delete(9);
    rb_delete(3);
    rb_delete(7);
    show_rb_tree(root);
    printf("/n");
    return 0;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩亚洲国产一区| 欧美极品美女电影一区| 91视频国产高清| 2019av中文字幕| 久久免费国产精品1| 久久九九热免费视频| 亚洲天堂av综合网| 国产亚洲激情在线| 久久久噜久噜久久综合| 欧美黄色免费网站| 亚洲精品综合久久中文字幕| 亚洲精品美女免费| 久久免费视频网站| 亚洲色图校园春色| 亚洲最大成人在线| 国产精品亚洲综合天堂夜夜| 亚洲福利视频久久| 91欧美视频网站| 国产亚洲精品va在线观看| 中文字幕日韩在线观看| 国产日韩精品一区二区| 日韩精品免费综合视频在线播放| 日韩欧美国产一区二区| 在线精品国产成人综合| 国产精品美女在线| 欧美成人精品一区二区| 成人a在线视频| 国产又爽又黄的激情精品视频| 中文字幕亚洲自拍| 欧美视频在线观看 亚洲欧| 国产精品男人爽免费视频1| 国产成人91久久精品| 亚洲黄色在线观看| 成人在线激情视频| 欧美一级bbbbb性bbbb喷潮片| 2019中文字幕在线| 国产91精品网站| 日韩av电影手机在线观看| 国产精品视频不卡| 精品国偷自产在线| 欧美一级在线亚洲天堂| 在线观看欧美www| 国产精品扒开腿做爽爽爽男男| 黑人巨大精品欧美一区二区免费| 日本精品免费一区二区三区| 精品国产欧美成人夜夜嗨| 亚洲成人网在线观看| 亚洲欧美三级伦理| 国产精品看片资源| 日韩av一区二区在线| 亚洲国产成人精品一区二区| 性欧美亚洲xxxx乳在线观看| 欧美成人精品xxx| 欧美精品福利视频| 97碰碰碰免费色视频| 国外成人在线视频| 55夜色66夜色国产精品视频| 日韩免费观看视频| 亚洲自拍偷拍福利| 亚洲精品美女在线| 国产精品久久久久久久久久新婚| 一区二区三区美女xx视频| 国产99久久精品一区二区永久免费| 欧美xxxx14xxxxx性爽| 欧美视频一二三| 国产成人一区二区三区小说| 久久久精品久久久久| 日韩av在线天堂网| 日韩高清人体午夜| 欧美性xxxxxxxxx| 日韩中文在线中文网在线观看| 国产男人精品视频| 国内精品一区二区三区| 国产欧美精品日韩精品| 色综合久久天天综线观看| 精品中文字幕久久久久久| 国产成人自拍视频在线观看| 亚洲欧美三级在线| 久久久久久久一区二区| 久久免费少妇高潮久久精品99| 欧美性20hd另类| 久久精品夜夜夜夜夜久久| 亚洲免费视频在线观看| 亚洲自拍中文字幕| 国产欧美精品xxxx另类| 亚洲老头老太hd| 欧美亚洲午夜视频在线观看| 欧美华人在线视频| 欧美精品电影在线| 狠狠色噜噜狠狠狠狠97| 国产精品久久久一区| 欧美日韩午夜视频在线观看| 亚洲韩国日本中文字幕| 国产欧美日韩精品专区| 国产一区二区三区视频在线观看| 精品国产依人香蕉在线精品| 亚洲精品久久久久久久久久久久久| www日韩欧美| 精品久久久久久| 国产成+人+综合+亚洲欧洲| 日韩精品视频三区| 精品香蕉一区二区三区| 亚洲va码欧洲m码| 欧美激情videoshd| 欧美亚洲国产日本| 日韩在线视频观看正片免费网站| 国产精品偷伦免费视频观看的| 亚洲人精品午夜在线观看| 美日韩精品免费视频| 欧美中文在线观看国产| 亚洲精品suv精品一区二区| 久久久久日韩精品久久久男男| 免费91麻豆精品国产自产在线观看| 81精品国产乱码久久久久久| 久久国产加勒比精品无码| 国产97在线|日韩| 福利精品视频在线| 欧美国产在线电影| 国产精品免费久久久久久| 尤物yw午夜国产精品视频| 亚洲xxxx18| 国产精品一区二区女厕厕| 98精品在线视频| 91在线视频精品| 欧美日韩中文字幕综合视频| 日韩电影免费观看在线观看| 91精品国产色综合久久不卡98| 精品成人国产在线观看男人呻吟| 国产中文字幕亚洲| 欧美日韩精品二区| 成人国产精品一区二区| 麻豆成人在线看| 欧美—级a级欧美特级ar全黄| 成人欧美一区二区三区黑人| 国产日本欧美在线观看| 国产精品国产三级国产aⅴ浪潮| 欧美—级a级欧美特级ar全黄| 成人天堂噜噜噜| 亚洲欧美在线免费观看| 国产精品亚洲美女av网站| 久热爱精品视频线路一| 国产欧美精品一区二区三区介绍| 日本一区二区三区在线播放| 久久精品影视伊人网| 国产精品啪视频| 国产精品美女网站| 亚洲国产精品成人va在线观看| 日韩中文有码在线视频| 欧美成人免费在线视频| 正在播放国产一区| 亚洲热线99精品视频| 欧美亚洲激情在线| 成人免费看黄网站| 国产精品高潮呻吟视频| 久久91亚洲人成电影网站| 国产欧美在线视频| 精品亚洲夜色av98在线观看| 久久久久久国产精品三级玉女聊斋| 日韩激情av在线播放| 日韩av在线最新| 国产成人综合亚洲| 日韩美女福利视频| 国产精品视频内| 欧美日韩亚洲网|