红黑树的插入操作
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(); }
相关文章推荐
- [2015-08-20] python026
- threading模块
- LVS+keepalived高可用
- 微信app支付问题
- HDU 1875 畅通工程再续
- poj 1386 Play on Words(欧拉通路)
- [2015-08-19] python025
- centOS6.6升级gcc4.8
- centOS6.6升级gcc4.8
- centOS6.6升级gcc4.8
- centOS6.6升级gcc4.8
- Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())
- Android WiFi 应用程序例子
- HDU 1879 继续畅通工程
- POJ 题目分类
- mac 启动nfsd共享
- Python正则表达式指南
- Apache ab测试 Apache优于 nginx
- HDU 题目分类
- Python线程指南