c++實現紅黑樹
阿新 • • 發佈:2018-12-17
現在只是簡單的實現了紅黑樹的調整功能,其餘功能還沒有實現好,等後面的學習中再來新增
#ifndef _RB_TREE_H_ #define _RB_TREE_H_ typedef bool _color_type; const _color_type _color_red_ = false; const _color_type _color_black_ = true; template <class T> struct RB_Tree_node{ public: _color_type color; T key; BR_Tree_node *left; BR_Tree_node *right; BR_Tree_node *parent; RB_Tree_node(){} RB_Tree_node(_color_type _color,T _key,BR_Tree_node *_left,BR_Tree_node* _right,BR_Tree_node8 _parent);color(_color),key(_key),left(_left),right(_right),parenr(_parent){} }; template <class T> struct RB_tree{ private: RB_Tree_node *header; RB_Tree_node *root; }; /* *這裡的左旋和右旋操作和AVL基本相似,但是還要維護x節點的父親節點以及每個節點的parent指標 */ template<class T> void __re_tree_rotate_left(RB_Tree_node* x,RB_Tree_node* &root){ RB_Tree_node* y = x->right; x->right = y->left; if(y->left != 0) y->left->parent = x; y->parent = x->parent; if(x == root) root = y; else if(x == x->parent->left) x->parent->left = y; else x->parent->right = y; y->left = x; x->parent = y; } template<class T> void __re_tree_rotate_right(RB_Tree_node* x,RB_Tree_node* &root){ RB_Tree_node* y = x->left; x->left = y->right; if(y->right != 0) y->right->parent = x; y->parent = x->parent; if(x == root) //更新x的parent指向x節點 根節點的parent為header root = y; else if(x == x->parnt->left)//判斷為x的右節點 x->parnet->left = y; else x->parent->right = y; y->left = x; x->parent = y; } template<class T> void __rb_tree_rebalance(RB_Tree_node *x, RB_Tree_node* &root) //RB樹的平衡的調整 { x->color = _color_red_; //首先將新節點的顏色設定為紅色,新節點必須為紅色 while(x != root && x->parent->color == _color_red_){ //父親節為紅色,並且當前節點不為根結點 因為只有當父親節點也為紅色的時候才會出現錯誤,並且後面不斷返回的x節點一直會為紅色 if(x->parent == x->parent->parent->left){//父親節點為祖父節點之左子節點 RB_Tree_node* y = x->parent->parent->right; //設定y為伯父節點 if(y->color == _color_red_){//伯父節點存在並且伯父節點為紅色 (滿足父親節點和伯父節點都為紅色的情況,那麼將父親節點和伯父節點變為黑色,曾祖父節點更改為紅色) y->color = _color_black_; x->parent->color = _color_black_; x->parent->parent->color = _color_red_; x = x->parent->parent;//將x設定為曾曾祖父,繼續向上傳遞,檢視是否含有上述情況 } else{ //無伯父節點,或者伯父節點為黑色(預設沒有節點就是黑色) 也就是出現錯誤,需要我們的調整 if(x == x->parent->right){//如果新節點為父親節點之右子節點 x = x->parent; __re_tree_rotate_left(x,root); } x->parent->parent->color = _color_red_;//更改顏色 x->parent->color = _color_black_; __rb_tree_rotate_right(x->parent->parent,root); } } else{ //父親節點為祖父節點右子節點 RB_Tree_node* y = x->parent->parent->left;//y為伯父節點 if(y->color == _color_red_){ //伯父節點為紅色 y->color = _color_black_; x->parent->color = _color_black_; x->parent->parent->color = _color_red_; x = x->parent->parent; //準備繼續向上檢查,將x設定為祖父節點 } else{ //伯父節點不存在或者為黑色,也就是出現錯誤,需要我們的調整!! if(x == x->parent->left){ //如果新節點為父親節點的左側節點 x = x->parent; __rb__tree_rotate_right(x,root);//右旋操作 } x->parent->parent->color = _color_red_; //修改顏色,繼續左旋 x->parent->color = _color_black_; __rb_tree_rotate_left(x->parent->parent,root); } } } root->color = _color_black_; //可能會出現修改根節點顏色的情況,可以將根節點直接修改為黑色,不影響RB樹的正確性 } #endif