學校:**大學
版本:紅黑樹初始版本
#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是日常搬磚中最常用的...