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

首頁 > 編程 > C > 正文

C語言如何實現紅黑樹

2020-02-24 14:24:00
字體:
來源:轉載
供稿:網友

我們有時候在看內核的時候會覺得紅黑樹很有意思,就會想要自己動手去實現,那么你知道C語言如何實現紅黑樹嗎?下面我們就跟著武林小編一起去看看C語言實現紅黑樹的方法。

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

寫代碼的時候很多次因為少考慮情況而導致錯誤,細節比較多,剛開始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;
}

以上就是關于C語言如何實現紅黑樹的內容,更多的CSS基礎知識,你可以到武林技術頻道學習,不需要很多時間,你就可以輕松學會這些技巧了。

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人中文字幕在线观看| 欧美最猛性xxxxx免费| 亚洲无限乱码一二三四麻| 色午夜这里只有精品| 日韩欧美a级成人黄色| 亚洲丁香久久久| 久久精品99久久久久久久久| 日韩亚洲精品电影| 欧亚精品中文字幕| 欧美在线视频一二三| 午夜精品免费视频| 日韩一级裸体免费视频| 日韩av在线电影网| 亚洲精品国产精品乱码不99按摩| 欧美激情性做爰免费视频| 欧美xxxx18国产| 国产精品午夜视频| 久久久综合免费视频| 国产有码一区二区| 色午夜这里只有精品| 日韩精品免费观看| 日韩欧美在线观看| 国产成人亚洲综合91| 久久久久久久香蕉网| 欧美精品九九久久| 一道本无吗dⅴd在线播放一区| 中文字幕日韩欧美| 一区二区在线视频播放| 欧美日韩国产综合视频在线观看中文| 韩国美女主播一区| 国产精品一区二区av影院萌芽| 精品久久中文字幕久久av| 日韩中文字幕在线播放| 国产精品十八以下禁看| 98精品在线视频| 亚洲福利视频在线| 欧美激情欧美激情在线五月| 久久久久久成人精品| 欧美日韩一区二区在线播放| 超碰97人人做人人爱少妇| 亚洲精品成a人在线观看| 亚洲成年人在线| 日韩在线视频观看正片免费网站| 中国人与牲禽动交精品| 国产一区视频在线| 成人在线观看视频网站| 亚洲欧洲在线观看| 亚洲毛片一区二区| 日韩欧美在线视频观看| 国产成人一区三区| 国产精品成人观看视频国产奇米| 国产色综合天天综合网| 日韩高清免费在线| 亚洲国产欧美一区| 欧美激情视频在线免费观看 欧美视频免费一| 日韩国产欧美精品一区二区三区| 中文字幕亚洲综合久久筱田步美| 欧美一级大胆视频| 精品国产自在精品国产浪潮| 91香蕉国产在线观看| 综合136福利视频在线| 久久韩国免费视频| 91夜夜未满十八勿入爽爽影院| 欧美日韩中文字幕日韩欧美| 亚洲一区二区三区乱码aⅴ蜜桃女| 日本欧美中文字幕| 国产成人97精品免费看片| 蜜臀久久99精品久久久久久宅男| 91中文精品字幕在线视频| 国产一区二区三区丝袜| 亚洲xxxx在线| 国产精品福利在线观看| 亚洲精品日韩激情在线电影| 国产亚洲精品激情久久| 国产成人精品电影久久久| 成人美女免费网站视频| 亚洲欧美国产一区二区三区| 2021久久精品国产99国产精品| 国产欧美一区二区| 久久免费精品日本久久中文字幕| 国产成人av网址| 国产一区二区视频在线观看| 国产精品久久久久久久久久| 久久婷婷国产麻豆91天堂| 98精品在线视频| 亚洲性xxxx| 精品福利视频导航| 久久视频在线看| 久久99热精品这里久久精品| 日韩国产中文字幕| 国模私拍视频一区| 欧美成人网在线| 91精品免费久久久久久久久| 美女福利视频一区| 亚洲xxx大片| 尤物九九久久国产精品的特点| 成人免费视频网址| 欧美精品在线观看| 久久人人爽人人爽人人片av高清| 亚洲第五色综合网| 国产激情视频一区| 日韩网站免费观看| 日韩视频在线一区| 最近中文字幕2019免费| 青青草99啪国产免费| 亚洲欧洲日韩国产| 欧美黄色免费网站| 国产日韩在线观看av| 亚洲第一网站免费视频| 亚洲人成网站色ww在线| 日韩欧美中文在线| 欧美日韩视频在线| 成人日韩av在线| 国产精品免费久久久| 国产日韩在线播放| 97在线视频一区| 亚洲性xxxx| 91情侣偷在线精品国产| 日韩av在线导航| 色综合色综合网色综合| 久久精品美女视频网站| 亚洲91精品在线观看| 日本欧美黄网站| 成人羞羞国产免费| 九九视频直播综合网| 最近2019中文字幕一页二页| 成人做爽爽免费视频| 亚洲国产精品资源| 国产一区二区黑人欧美xxxx| 欧美午夜激情小视频| 日韩av片永久免费网站| 久久久久久亚洲精品| 国产精品一久久香蕉国产线看观看| 国产精品美女免费| 欧美在线观看网站| 国产精品毛片a∨一区二区三区|国| 久久久久久国产精品三级玉女聊斋| 欧美日韩免费看| 久久国产精品久久国产精品| 亚洲第一精品福利| 亚洲精品视频网上网址在线观看| 一区二区三区视频在线| 精品综合久久久久久97| 色综合视频一区中文字幕| 亚洲欧美国产一区二区三区| 欧美精品成人在线| 国产手机视频精品| 亚洲网站在线观看| 欧美日韩免费观看中文| 日韩一区二区精品视频| 亚洲欧美国产一本综合首页| 美女啪啪无遮挡免费久久网站| 97热在线精品视频在线观看| 免费av一区二区| 久久激情视频免费观看| 国产欧美va欧美va香蕉在| 国产精品久久久久久av福利软件| 欧美性猛交99久久久久99按摩| 国产国语刺激对白av不卡| 欧美在线一区二区视频| 法国裸体一区二区| 国产成人精品在线观看| 日韩av免费在线看| 成人午夜两性视频|