Definition of the red/black tree:
A binary search tree is a red-black tree if it meets the following requirements:
1) each node is either red or black.
2) The root node is black.
3) each leaf node (NiL) is a black node.
4) if a node is red, both of its sons are black.
5) for each node, all paths from the node to its child node contain the same number of nodes for the black nodes.
C ++ code implementation:
Brtreenode. h
#ifndef BRTREENODE_H_INCLUDED#define BRTREENODE_H_INCLUDED#include<iostream>using namespace std;class BRTree;class BRTreeNode{private:friend class BRTree;int key;bool color;BRTreeNode* left;BRTreeNode* right;BRTreeNode* parent;public:BRTreeNode():key(-1),color(0),left(NULL),right(NULL),parent(NULL){}BRTreeNode(BRTreeNode* node):key(node->key),color(node->color),left(node->left),right(node->right),parent(node->parent){}BRTreeNode(int num,bool flag):key(num),color(flag),left(NULL),right(NULL),parent(NULL){}~BRTreeNode(){}int Getkey(){return key;}bool Getcolor(){return this->color;}BRTreeNode* GetLeft(){return this->left;}BRTreeNode* Getright(){return this->right;}BRTreeNode* Getparent(){return this->parent;}void Inorder(){if(this!=NULL){this->left->Inorder();cout<<this->key<<" ";this->right->Inorder();}}void Preorder(){if(this!=NULL){cout<<this->key<<" ";this->left->Preorder();this->right->Preorder();}}void Postorder(){if(this!=NULL){this->left->Postorder();this->right->Postorder();cout<<this->key<<" ";}}void MakeEmpty(){if(this!=NULL){this->left->MakeEmpty();this->right->MakeEmpty();delete this;}}int GetHeight(){int L,R;if(this==NULL){return 0;}L=this->left->GetHeight();R=this->right->GetHeight();return 1+(L>R? L:R);}};#endif // BRTREENODE_H_INCLUDED
Brtree. h
# Ifndef brtree_h_included # define maxsize 30 # define maxwidth 30 # include "brtreenode. H "class brtree {PRIVATE: brtreenode * root; brtreenode * nil; public: brtree (): nil (New brtreenode () {nil-> color = 0; nil-> key =-1; nil-> left = nil-> right = nil-> parent = NULL; root = nil ;}~ Brtree () {makeempty (Root); Delete nil;} // clear the void makeempty (brtreenode * node) {If (node! = Nil) {makeempty (node-> left); makeempty (node-> right); delete node ;}} int getkey (brtreenode * node) {return node-> getkey ();} bool getcolor (brtreenode * node) {return node-> getcolor ();} brtreenode * getroot () {return root ;} brtreenode * getparent (brtreenode * node) {return node-> parent;} int getheight (brtreenode * node) {int L, R; If (node = nil) return 0; L = getheight (node-> left); r = getheight (node-> right); return 1 + (L> r? L: R);} int getblackheight (brtreenode * node) {int L, R; If (node = nil) return 0; L = getheight (node-> left ); R = getheight (node-> right); If (node-> getcolor () Return (L> r? L: R); else return 1 + (L> r? L: R);} void inorder (brtreenode * node) {If (node! = Nil) {inorder (node-> left); cout <node-> key <""; inorder (node-> right );}} void preorder (brtreenode * node) {If (node! = Nil) {cout <node-> key <""; preorder (node-> left); preorder (node-> right );}} void posetorder (brtreenode * node) {If (node! = Nil) {posetorder (node-> left); posetorder (node-> right); cout <node-> key <"";}} // print tree void disptree (brtreenode * BT) {brtreenode stack [maxsize], p; int level [maxsize] [2], top, N, I, width = 4; If (BT! = NULL) {cout <"display a tree by hollow means. "<Endl; Top = 1; stack [Top] = Bt; // push root point to stack. level [Top] [0] = width; while (top> 0) {P = stack [Top]; n = level [Top] [0]; for (I = 1; I <= N; I ++) cout <"; // output information if (P. key = 0) {cout <")";} else {If (P. key =-1) cout <"nil"; else if (P. left & P. right) cout <"(" <p. key; else cout <p. key; If (P. getcolor () cout <"R,"; else cout <"B," ;}for (I = n + 1; I <maxwidth; I + = 2) cout <"--"; cout <Endl; top --; If (P. Right! = NULL) {// insert a bracket node. The key value is 0 top ++; brtreenode * TMP = new brtreenode (); TMP-> key = 0; stack [Top] = TMP; level [Top] [0] = N + width; level [Top] [1] = 2; top ++; stack [Top] = P. right; level [Top] [0] = N + width; level [Top] [1] = 2;} If (P. left! = NULL) {top ++; stack [Top] = P. left; level [Top] [0] = N + width; level [Top] [1] = 1 ;}}// nodebool leftrotate (brtreenode * node) {brtreenode * Y; If (node-> right = nil) {cout <"can't left rotate! "<Endl; return 0;} y = node-> right; node-> right = Y-> left; If (Y-> left! = Nil) {Y-> left-> parent = node;} y-> parent = node-> parent; If (node-> parent = nil) {root = y;} else if (node-> parent-> left = node) {node-> parent-> left = y ;} else {node-> parent-> right = y;} y-> left = node; node-> parent = y; return 1 ;} // right-hand node bool rightrotate (brtreenode * node) {If (node-> left = nil) {cout <"can't rightrotate! "<Endl; return 0;} brtreenode * X; X = node-> left; node-> left = x-> right; if (X-> right! = Nil) {X-> right-> parent = node;} X-> parent = node-> parent; If (node-> parent = nil) {root = x;} else if (node-> parent-> left = node) {node-> parent-> left = x ;} else {node-> parent-> right = x;} node-> parent = x; X-> right = node; return 1;} void insert (INT num) {brtreenode * node = new brtreenode (Num, 1); node-> left = nil; node-> right = nil; node-> parent = nil; brtreenode * P = root, * q = nil; If (root = nil) {node-> color = 0; root = node; root-> left = root-> right = r Oot-> parent = nil; return;} while (P! = Nil) {If (p-> key = num) {cout <num <"has exist! "<Endl; return;} else if (p-> key> num) {q = P; P = p-> left;} else {q = P; P = p-> right ;}}if (Q-> key> num) {q-> left = node; node-> parent = Q ;} else {q-> right = node; node-> parent = Q;} rbinsertadjust (node);} void rbinsertadjust (brtreenode * node) {brtreenode * Y; while (node-> parent-> color = 1) {If (node-> parent = node-> parent-> left) {Y = node-> parent-> right; if (Y-> color = 1) {node-> parent-> color = 0; y-> color = 0; y-> parent-> color = 1; n Ode = node-> parent;} // at this time, the color of Y is black else {// case 2 if (node = node-> parent-> right) {node = node-> parent; leftrotate (node);} // The third case node-> parent-> color = 0; node-> parent-> color = 1; rightrotate (node-> parent );}} else {Y = node-> parent-> left; If (Y-> color = 1) {node-> parent-> color = 0; y-> color = 0; y-> parent-> color = 1; node = node-> parent ;} else {If (node = node-> parent-> left) {node = node-> parent; rightrota Te (node);} node-> parent-> color = 0; node-> parent-> color = 1; leftrotate (node-> parent) ;}} root-> color = 0;} brtreenode * search (INT num) {brtreenode * P = root; while (P! = Nil) {If (p-> key = num) {return P;} else if (p-> key> num) {P = p-> left ;} else {P = p-> right ;}} cout <"there is no" <num <"in this tree! "<Endl; return nil;} // gets the minimum element of the tree with node as the root node, and returns the minimum int minnum (brtreenode * node) {brtreenode * P = node; while (p-> left! = Nil) {P = p-> left;} return p-> key;} // gets the SHDA element of the tree with the node as the root node, return the maximum da value int maxnum (brtreenode * node) {brtreenode * P = node; while (p-> right! = Nil) {P = p-> right;} return p-> key;} // obtain the minimum element of the tree with the node as the root node, return the brtreenode * minnum (brtreenode * node) {brtreenode * P = node; while (p-> left! = Nil) {P = p-> left;} return P;} // obtain the maximum element brtreenode * maxnum (brtreenode * node) of the tree with the node as the root node) {brtreenode * P = node; while (p-> right! = Nil) {P = p-> right;} return P;} brtreenode * inordersuccessor (brtreenode * node) {If (node-> right! = Nil) {return minnum (node-> right);} else {brtreenode * P = getparent (node); While (P & node = p-> right) {node = P; P = getparent (node) ;}return P ;}// the frontend brtreenode * inordepredecessor (brtreenode * node) of the central Traversal) {If (node-> left! = Nil) {return maxnum (node-> left);} else {brtreenode * P = getparent (node); While (P & node = p-> left) {node = P; P = getparent (node);} return P ;}} bool Delete (INT num) {brtreenode * z, * y, * X; // find the node P z = search (Num) whose key value is num; // if this node does not exist, return 0 if (Z = nil) {return 0 ;} if (Z-> left = nil | Z-> right = nil) {Y = z;} Elsey = inordersuccessor (z); If (Y-> left! = Nil) x = Y-> left; elsex = Y-> right; X-> parent = Y-> parent; If (X-> parent = nil) root = x; else if (y = Y-> parent-> left) Y-> parent-> left = x; Elsey-> parent-> right = X; if (y! = Z) {z-> key = Y-> key;} If (Y-> color = 0) {rbtreefixup (x);} return 1 ;} void rbtreefixup (brtreenode * X) {brtreenode * w; while (X! = Root & X-> color = 0) {If (x = x-> parent-> left) {W = x-> parent-> right; if (W-> color = 1) {w-> color = 0; X-> parent-> color = 1; leftrotate (X-> parent ); W = x-> parent-> right;} If (W-> left-> color = 0 & W-> right-> color = 0) {w-> color = 1; X = x-> parent;} else {If (W-> right-> color = 0) {w-> color = 1; rightrotate (w); W = x-> parent-> right;} w-> color = x-> parent-> color; X-> parent-> color = 0; w-> right-> color = 0; leftrotate (X-> parent); X = root;} else {W = x-> parent-> left; if (W-> color = 1) {w-> color = 0; X-> parent-> color = 1; rightrotate (X-> parent ); W = x-> parent-> left;} If (W-> right-> color = 0 & W-> left-> color = 0) {w-> color = 1; X = x-> parent;} else {If (W-> left-> color = 0) {w-> color = 1; leftrotate (w); W = x-> parent-> left;} w-> color = x-> parent-> color; X-> parent-> color = 0; w-> left-> color = 0; rightrotate (X-> parent); X = root; }}x-> color = 0 ;};# endif/brtree_h_included
Test procedure
#include <iostream>#include"BRTree.h"#include "BRTreeNode.h"using namespace std;int main(){ BRTree tree; cout<<"Insert 9 numbers:"<<endl; int a[9]={8,11,17,15,6,1,22,25,27}; int i; for(i=0;i<9;i++) { tree.Insert(a[i]); } tree.DispTree(tree.Getroot()); cout<<"Delete 11:"<<endl; tree.Delete(11); tree.DispTree(tree.Getroot()); cout << "blackHeight:" <<tree.GetBlackHeight(tree.Getroot())<<endl; return 0;}
Running result:
Refer:
Teach you a thorough understanding of the red and black tree-http://blog.csdn.net/v_JULY_v/article/details/6105630