#include <iostream> #include <stdio.h> using namespace std; enum Color {RED=1, BLACK}; typedef struct brNode { Color color; int key; brNode * left; brNode * right; brNode * p; } brNode; bool left_Rotate(brNode * T, brNode * x); bool right_Rotate(brNode * T, brNode * x); bool insertNode(brNode * &T, brNode * z); void insert_fixUp(brNode * T, brNode * z); void brTreeTravel(brNode * head); int main() { brNode * head = NULL; const size = 13; int value[size] = {7,4,11,3,6,9,18,2,14,19,12,17,22}; for(int i=0; i<size; ++i) { brNode * z = new brNode(); z->key = value[i]; z->left = NULL; z->right = NULL; z->p = NULL; insertNode(head,z); printf("%d /n ",z->key); } brTreeTravel(head); }; //遍历整个树 void brTreeTravel(brNode * head) { brNode * p = head; if(p == NULL) return ; brTreeTravel(p->left); printf("key:% color:%d n",p->key,p->color); brTreeTravel(p->right); } //插入一个节点 bool insertNode(brNode * &T, brNode * z) { //找到需要插入的位置 brNode * y = NULL; brNode * x = T; while(x != NULL) { y = x; if( z->key < y->key) { x = x->left; }else{ x = x->right; } } z->p = y; //y==NULL说明插入时没有节点,插入节点z,并置颜色为红色 if(y == NULL) { T = z; z->color = BLACK; z->left = NULL; z->right = NULL; return true; }else if(z->key < y->key) { y->left = z; }else{ y->right = z; } z->left = NULL; z->right = NULL; z->color = RED; //由下到上进行调整 insert_fixUp(T,z); } //由插入节点由下到上进行调整 void insert_fixUp(brNode * T, brNode * z) { brNode * y = NULL; while((z != T) && ((z->p)->color == RED)) { if(z->p == ((z->p)->p)->left) { y = ((z->p)->p)->right;//y表示z的父节点的兄弟节点 if((y !=NULL)&&(y->color == RED))//情况1 { (z->p)->color = BLACK; y->color = BLACK; ((z->p)->p)->color = RED; z = (z->p)->p; }else{ if(z == (z->p)->right)//情况2 { z = z->p; left_Rotate(T,z); } //情况3 (z->p)->color = BLACK; ((z->p)->p)->color = RED; right_Rotate(T,(z->p)->p); } }else if(z->p == ((z->p)->p)->right){ y = ((z->p)->p)->left; if((y !=NULL)&&(y->color == RED))//情况1 { (z->p)->color = BLACK; y->color = BLACK; ((z->p)->p)->color = RED; z = (z->p)->p; }else{ if(z == (z->p)->right)//情况2 { z = z->p; left_Rotate(T,z); } //情况3 (z->p)->color = BLACK; ((z->p)->p)->color = RED; right_Rotate(T,(z->p)->p); } } } T ->color = BLACK; } bool left_Rotate(brNode * T, brNode * x) { if(x->right != NULL) { brNode * y = x->right; x->right = y->left; if(y->left != NULL) { (y->left)->p = x; } y->p = x->p; if(x->p == NULL) { T = y; }else if(x == (x->p)->left){ (x->p)->left = y; }else{ (x->p)->right = y; } x->p = y; y->left = x; return true; }else { return false; } } bool right_Rotate(brNode * T, brNode * x) { if(x->left != NULL) { brNode * y = x->left; x->left = y->right; if(y->right != NULL) { (y->right)->p = x; } y->p = x->p; if(x->p == NULL) { T = y; }else if(x == (x->p)->left){ (x->p)->left = y; }else{ (x->p)->right = y; } x->p = y; y->right = x; return true; }else { return false; } }