您的位置:首页 > 其它

红黑树的插入操作

2015-08-20 23:13 253 查看
红黑树是2-3-4树的一个变体

#include <stdlib.h>
#include <stdio.h>
//#define Key int
#define hl h->l
#define hr h->r
#define hlr h->l->r
#define hll h->l->l
#define hrr h->r->r
#define hrl h->r->l
typedef char Key;
struct Item{
Key key;
//	char c;
};
typedef struct STnode* link;
struct STnode{
Item item ; link l,r; int N; int red;
};

static link head , z ;
static struct Item NULLitem ;

Key key(Item item){
return item.key;
}
//创建一个节点
link NEW(Item item, link l,link r, int N,int red){
link x = (link)malloc(sizeof *x);
x->item = item;x->l = l;x->r = r;x->N = N;x->red = red;
if(head==z)head=x; //这句话不能少!!!
return x;
}
//初始化
void STinit(){
head = ( z = NEW(NULLitem,0,0,0,0));
}

//右旋转 顺时针旋转
link rotR(link h){
link x = h->l; h->l = x->r; x->r=h;
}
//左旋转 逆时针旋转
link rotL(link h){
link x = h->r; h->r = x->l; x->l=h;
}

//红黑树的插入
link RBinsert(link h, Item item, int sw){ //sw 的作用??
Key v = key(item);
if(h==z) return NEW(item,z,z,1,1);
if((hl->red) && (hr->red))
{h->red=1;hl->red=0;hr->red=0;} //分裂4-节点
if(v<key(h->item)) {
hl = RBinsert(hl,item,0);
if(h->red && hl->red && sw) h = rotR(h);
if(hl->red && hll->red)
{h=rotR(h);h->red=0;hr->red=1;}//hr的red一定要改回来,防止旋转后丢失
}else{
hr = RBinsert(hr,item,1);
if(h->red && hr->red && !sw) h = rotL(h);
if(hr->red && hrr->red)
{h=rotL(h);h->red=0;hl->red=1;}
}
h->N++;return h;
}

//红黑树的插入
void STinsert(Item item){
head =  RBinsert(head,item,0);head->red = 0;
}

void sortR(link h){
if(h==z)return;
sortR(h->l);
printf("%c ",h->item.key);
sortR(h->r);
}
//二叉搜索树排序
void STsort(){
sortR(head);
}

main(){
STinit();
struct Item item[10] = {'a','s','e','r','c','h','i','n','g','x'};
int i;
for(i=0;i<10;i++)
STinsert(item[i]);
STsort();

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: