紅黑樹原始碼及錯誤解析

2021-08-26 11:29:00 字數 2592 閱讀 8953

學校:**大學

版本:紅黑樹初始版本

#include"stdio.h"

#include"malloc.h"

#define min -99999999 //不要加等號

#define max 99999999

struct node

long key;

char color;

struct node *p;

struct node *leftchild;

struct node *rightchild;

node *nil,*root;//建立根節點和葉子節點

int printnode=0;

node *createnode(int key);

void rb_insert_fixup(node *t,node *z);

void nil_create();//葉子節點建立

void rb_insert(node *t,node *z);//弄演算法導論上非遞迴的吧

void left_rotate(node *t,node *z);//向左旋轉

void right_rotate(node *t,node *z);

void printrbtree(node *t);//輸出樹

void nil_create()//葉子節點建立

nil=(node *)malloc(sizeof(node));

root=(node *)malloc(sizeof(node));

nil->key=min;

nil->color='b';

//nil->p=null;//這裡注意

nil->leftchild=nil;

nil->rightchild=nil;

root=nil;

node *createnode(int key)

node *x = (node *)malloc(sizeof(node));

x->color ='r';

x->key = key;

x->leftchild = nil;

x->rightchild = nil;

x->p = null;

return x;

void rb_insert(node *t,node *z)//弄演算法導論上非遞迴的吧

node *x,*y;//y用來記錄父節點

x=root;//這裡應該是 根節點 跟形式引數重複 會造成錯誤

y=nil;

while(x!=nil)//x為要插入的位置de父節點 y為x的父節點

y=x;

if(x->key>z->key)

x=x->leftchild;

else

x=x->rightchild;

z->p=y;

if(y==nil)//初始化 插入到空樹種

root=z;

else if(z->keykey)

y->leftchild=z;

else

y->rightchild=z;

z->leftchild=nil;

z->rightchild=nil;

z->color='r';

rb_insert_fixup(t,z);

void rb_insert_fixup(node *t,node *z)

node *y;

while(z->p->color=='r')//插入節點 是紅節點 如果父節點也是紅節點 則需要調整

if(z->p==z->p->p->leftchild)//插入的節點的父節點 是祖父節點的左孩子

y=z->p->p->rightchild;//祖父節點的右孩子

if(y->color=='r')//二叔是 紅色的o(∩_∩)o哈哈~

z->p->color='b';

y->color='b';

z->p->p->color='r';

z=z->p->p;

else

;//long a[10]=;

// long a[10]=;

// long a=;//這個可以

long a=;//這個不可以

node *z[11];

nil_create();

// nil=(node *)malloc(sizeof(node));

// nil=nil_create();

printf(" 1111111");

for(int j = 0; j <10; j++)

printf(" 222222 ");

z[j]=createnode(a[j]);

rb_insert(root,z[j]);

printf(" 222222 ");

inorder_tree_walk(root);

// printrbtree(root);

return 0;

出現的錯誤及除錯方法:

總是到insert_fix_up時候出現錯誤;原因是 第三種情況 要寫在 if(y.color=='r') else 不要忘記在else 之後加上 大括號

TreeMap 紅黑樹 原始碼解析

紅黑樹是一種平衡二叉搜尋樹。它可以在o log n 的時間內完成查詢,插入和刪除。二叉搜尋樹 左邊的節點都小於父節點,右邊的節點都大於父節點。平衡二叉樹 任意左右兩個子樹的葉子節點的高度相差不超過1。關於二叉樹的分類可以看筆者的這篇文章 一句話弄懂常見二叉樹型別 分成這兩個概念來看,紅黑樹就非常好理...

Set原始碼解析(紅黑樹)

之前粗略看了一下list和map,今咱來聊一下set。主要看以下幾個 1 hashset 2 collections.synchronizedset 3 linkedhashset 4 copyonwritearrayset 5 treeset 一 hashset hashset是日常搬磚中最常用的...

底層實現紅黑樹 Set原始碼解析(紅黑樹)

之前粗略看了一下list和map,今咱來聊一下set。主要看以下幾個 1 hashset 2 collections.synchronizedset 3 linkedhashset 4 copyonwritearrayset 5 treeset 一 hashset hashset是日常搬磚中最常用的...