red-black tree
来源:互联网 发布:淘宝信誉刷到皇冠 编辑:程序博客网 时间:2024/06/05 14:12
#include<bits/stdc++.h>using namespace std;#define BLACK 1#define RED 0struct node{ int value; int color; node * left; node * right; node * parent;};node * grandparent(node *n){ if((NULL!=n) && (n->parent!=NULL)){ return n->parent->parent; }else return NULL;}node * uncle(node *n){ node *g = grandparent(n); if(NULL==g) return NULL; if(n->parent==g->left) return g->right; else return g->left;}void insert(){}void rotate_left(node *n){ node *saved_p = g->left; node *save_left_n = n->left; g->left = n; n->left = saved_p; save_p->right = saved_left_n; n->parent = g; p->parent = n; if(saved_left_n){ saved_left_n->parent = n; }}void rotate_right(node *n){ node * saved_p = g->right; node * saved_right_n = n->right; g->right = n; n->right = saved_p; saved_p->left = saved_right_n; n->parent = g; p->parent = n; if(saved_right_n){ saved_right_n->parent = n; }}void insert_case5(node *n){ node * g = grandparent(n); n->parent->color = BLACK; g->color = RED; if(n==n->parent->left){ rotate_right(g); }else rotate_left(g);}void insert_case4(node *n){ node *g = grandparent(n); //because parent node is red,so grandparent certainly exists if((n==n->parent->right)&&(n->parent==g->left)){ rotate_left(n->parent); n = n->left; }else if((n==n->parent->left)&&(n->parent==g->right)){ rotate_right(n->parent); n = n->right; } insert_case5(n);}void insert_case3(node *n){ node *u = uncle(n),*g; if((NULL!=u) && (u->color==RED)){ n->parent->color = BLACK; u->color = BLACK; g = grandparent(n); g->color = RED; insert_case1(g); }else insert_case4(n);}void insert_case2(node *n){ if(n->parent->color==BLACK){ return ; } else insert_case3(n);}void insert_case1(node *n){ if(n->parent==NULL){ n->color = BLACK; } else insert_case2(n);}node *sibling(node *n){ if(n==NULL||n->parent==NULL){ return NULL; } if(n==n->parent->left) return n->parent->right; else return n->parent->left;}void delete_case6(node *n){ node * s = sibling(n); n->parent->color = BLACK; if(n==n->parent->left){ s->right->color = BLACK; rotate_left(n->parent); }else{ s->left->color = BLACK; rotate_right(n->parent); }}void delete_case5(node *n){ node * s = sibling(n); if(s->color==BLACK){ if((n==n->parent->left)&&(s->right->color==BLACK)&&(s->left->color==RED)){ s->color = RED; s->left->color = BLACK; rotate_right(s); } }else if((n==n->parent->right)&&(s->left->color==BLACK)&&(s->right->color==RED)){ s->color = RED; s->right->color = BLACK; rotate_left(s); } delete_case6(n);}void delete_case4(node * n){ node * s = sibling(n); if((n->parent->color==RED)&&(s->color==BLACK)&&(s->right->color==BLACK)){ s->color = RED; n->parent->color = BLACK; } delete_case5(n);}void delete_case3(node * n){ node * s = sibling(n); if((n->parent->color == BLACK)&& (s->color==BLACK) &&(s->left->color==BLACK) && (s->right->color==BLACK)){ s->color = RED; }else{ delete_case4(n); }}void delete_case2(node * n){ node * s = sibling(n); if(s->color == RED){ n->parent->color= BLACK; s->color = BLACK; if(n == n->parent->left) rotate_left(n->parent); else rotate_right(n->parent); } delete_case3(n);}void delete_case1(node *n){ if(n->parent!=NULL){ delete_case2(n); }}void delete_one_child(node *n){ node * child = is_leaf(n->right)?n->left:n->right; replace_node(n,child); if(n->color == BLACK){ if(child->color == RED) child->color = BLACK; else delete_case1(child); } delete n;}int main(){}
0 0
- 红黑树Red-Black-Tree
- 红黑树(Red Black Tree)
- Red-Black Tree
- red-black tree
- Red Black Tree
- 红黑树(red black tree)
- red-black tree
- Red Black Tree
- Red Black Tree
- Red-black Tree
- Red-Black Tree红黑树
- Red-Black Tree 红黑树
- 红黑树red-black-tree
- Red-Black Tree
- Red-Black Tree
- Red-Black Tree
- Red Black Tree
- red-black tree
- 第4周 项目3 -- 单链表应用(3)
- How to solve “Plugin execution not covered by lifecycle configuration” for Spring Data Maven Builds
- poj3070 Fibonacci 数论专题
- MVC
- 单链表应用问题--课本素材
- red-black tree
- auto,register,extern,static使用及区别
- CocoPods基本使用
- [Python]网络爬虫(二):利用urllib2通过指定的URL抓取网页内容
- Codeforces Round 341D
- 通用Adapter设计,SparseArray+泛型+回调的使用
- UVa OJ 12265 - Selling Land
- Java数组
- HTTP协议入门