日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构拾遗(2) --红黑树的设计与实现(中)

發布時間:2025/3/17 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构拾遗(2) --红黑树的设计与实现(中) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Insert完善

? ? 根據規則4,?新增節點必須為紅;?根據規則3,?新增節點之父節點必須為黑.

?

示例:

? ? (1)插入16(紅色)/55(紅色),?則既不用旋轉,?也不用重新染色

? ? (2)插入82(紅色),?則違反了紅黑規則,?需要進行動態的調整;

?

紅黑樹所需的處理

1.單旋轉


? ? ?新插入的X與其父P都是紅色的,?而且X還是G的外部孫子;

?

2.雙旋轉


? ? 新插入的X與其父P都是紅色的,?而且X還是G的內部孫子;

?

3.還需要處理有兩個紅色孩子的節點,?將右兒子變成黑色的,?我們只允許左兒子是紅色的;方法:?旋轉+重新染色

?

insert完整實現代碼:

/**注意帶有 ++ 注釋的為新添加的代碼**/ template <typename Comparable> void RedBlackTree<Comparable>::insert(const Comparable &x) {current = parent = grand = great = header;nullNode->element = x;while (current->element != x){//讓祖父成為曾祖父, 父親成為祖父, 自己成為父親//每個人都長了一輩great = grand;grand = parent;parent = current;current = (x < current->element) ? current->left: current->right;// ++//+ 處理1. 如果current節點有兩個紅孩子if ((current->left->color == RED) && (current->right->color == RED))handleReorient( x );}//如果樹中包含相同的元素if (current != nullNode)throw DuplicateItemException();current = new Node(x, nullNode, nullNode);if (x < parent->element)parent->left = current;elseparent->right = current;// ++//+ 處理2. 如果新插入的節點破壞了紅黑規則, 則還需做一次處理handleReorient( x ); } /**自動平衡函數:[1]重新染色[2]自動旋轉 */ template <typename Comparable> void RedBlackTree<Comparable>::handleReorient(const Comparable & item) {// 將current節點染成紅色current->color = RED;// 將current的left和right節點染成黑色current->left->color = current->right->color = BLACK;// 如果current節點的父節點也是紅的 -> 單旋轉 or 雙旋轉if( parent->color == RED ){//則將其祖父(爺爺)的顏色染成紅色grand->color = RED;//然后判斷新插入的節點是否是內部孫子?//如果是, 則增加一次旋轉->構成雙旋轉//if注釋: 如果該節點小于爺爺, 小于爸爸, 這兩種情況不同時滿足//則說明其是爺爺的內孫子if( (item < grand->element) != (item < parent->element) ){// 則依grand(祖父)節點進行旋轉parent = rotate( item, grand ); // Start double rotate}// 則依great(曾祖父)節點進行旋轉current = rotate( item, great );//令當前節點為黑色current->color = BLACK;}//根節點必須是黑色的header->right->color = BLACK; // Make root black } // 自動判斷并進行旋轉函數 template <typename Comparable> typename RedBlackTree<Comparable>::Node * RedBlackTree<Comparable>::rotate(const Comparable &item,Node *theParent ) {//位于theParent的左子樹if( item < theParent->element ){//如果為真, 則說明theParent->left有左孩子,//否則, 有右孩子item < theParent->left->element ?//如果theParent左邊有一棵子樹, 則以theParent->left//為軸, 向右轉rotateWithLeftChild( theParent->left ) : // LL//如果theParent右邊有一棵子樹, 則以theParent->left//為軸, 向左轉rotateWithRightChild( theParent->left ) ; // LRreturn theParent->left; //返回左子樹}else //位于右子樹{//如果為真, 則說明theParent->right有左孩子,往右轉//否則, 有右孩子, 往左轉item < theParent->right->element ?rotateWithLeftChild( theParent->right ) : // RLrotateWithRightChild( theParent->right ); // RRreturn theParent->right; //返回右子樹} }

測試代碼:

int main() {//用NEG_INF來代表負無窮大const int NEG_INF = -999999;RedBlackTree<int> tree(NEG_INF);tree.insert(50);cout << tree.header->right->element << " " << tree.header->right->nodeColor() << endl;cout << endl;tree.insert(40);cout << tree.header->right->left->element << " " << tree.header->right->left->nodeColor() << endl << endl;//此時需要進行旋轉和重新染色tree.insert(30);cout << tree.header->right->element << " " << tree.header->right->nodeColor() << endl ;cout << tree.header->right->left->element << " " << tree.header->right->left->nodeColor() << endl;cout << tree.header->right->right->element << " " << tree.header->right->right->nodeColor() << endl;return 0; }
//由于需要用到nodeColor成員函數, 因此我們將RedBlackNode類改造如下: template <typename Comparable> class RedBlackNode {friend class RedBlackTree<Comparable>; public:RedBlackNode(const Comparable &theElement = Comparable(),RedBlackNode *theLeft = NULL,RedBlackNode *theRight = NULL,int theColor = RedBlackTree<Comparable>::BLACK): element(theElement), left(theLeft), right(theRight), color(theColor) {}public://返回當前節點的顏色, 以作測試std::string nodeColor() const{return (color == RedBlackTree<Comparable>::BLACK) ? "black" : "red";}public:Comparable element;RedBlackNode *left;RedBlackNode *right;int color; };

紅黑樹其他操作

template <typename Comparable> class RedBlackTree {...bool isEmpty() const;void makeEmpty();Gref<Comparable> find(const Comparable & x) const;Gref<Comparable> findMin() const;Gref<Comparable> findMax() const;//遞歸刪除所有節點void reclainMemory(Node *t) const;... };


//析構函數完善版本 template <typename Comparable> RedBlackTree<Comparable>::~RedBlackTree() {if (!isEmpty())makeEmpty();delete nullNode;delete header; }
//紅黑樹查找:與二叉查找樹類似 template <typename Comparable> Gref<Comparable> RedBlackTree<Comparable>::find(const Comparable &x) const {if (isEmpty())return Gref<Comparable>();nullNode->element = x;Node *iter = header->right;while (true){if (x < iter->element)iter = iter->left;else if (x > iter->element)iter = iter->right;//如果 x == iter->elementelse if (iter != nullNode)return Gref<Comparable>(iter->element) ;elsereturn Gref<Comparable>();} }
//查找最大值: 一路向右 template <typename Comparable> Gref<Comparable> RedBlackTree<Comparable>::findMax() const {if (isEmpty())return Gref<Comparable>();Node *iter = header->right;while (iter->right != nullNode){// 一直向右走iter = iter->right;}return Gref<Comparable>(iter->element); }
//查找最小值: 一路向左 template <typename Comparable> Gref<Comparable> RedBlackTree<Comparable>::findMin() const {if (isEmpty())return Gref<Comparable>();Node *iter = header->right;while (iter->left != nullNode){// 一直向左走iter = iter->left;}return Gref<Comparable>(iter->element); }
template <typename Comparable> bool RedBlackTree<Comparable>::isEmpty() const {if (header->right == nullNode)return true;return false; }template <typename Comparable> void RedBlackTree<Comparable>::makeEmpty() {reclainMemory(header->right);header->right = nullNode; }template <typename Comparable> void RedBlackTree<Comparable>::reclainMemory(Node *t) const {//t == t->left的時候, 是當t==nullNode時if (t != t->left){reclainMemory(t->left);reclainMemory(t->right);delete t;} }

Gref設計與實現

//一個包裝器: 將指針封裝成為引用 template <typename Object> class Gref { public:Gref(): obj(NULL) {}explicit Gref(const Object &x): obj(& x) {}const Object &get() const{if (isNull())throw NullPointerException();elsereturn * obj;}bool isNull() const{if (obj == NULL)return true;return false;}private:const Object * obj; };

總結

以上是生活随笔為你收集整理的数据结构拾遗(2) --红黑树的设计与实现(中)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 99成人国产精品视频 | 射射射综合网 | 国产精品视频免费观看 | 69亚洲精品 | 亚洲字幕av一区二区三区四区 | 亚洲精品人妻无码 | 亚洲毛片在线观看 | 99亚洲国产精品 | 国产女主播自拍 | 日韩精品免费视频 | 成人区精品一区二区婷婷 | 日本午夜精品 | 亚洲av无一区二区三区 | 黄色国产一区二区 | 成人99视频 | youjizz麻豆| 欧洲亚洲精品 | 国产伦精品一区二区三区照片91 | 亚洲午夜精品一区二区三区他趣 | 国产精品美女久久久久av超清 | www.我爱av| 给我看高清的视频在线观看 | 麻豆社| 中文字幕免费视频 | 欧美丰满美乳xxⅹ高潮www | 青青青手机视频在线观看 | 都市激情亚洲一区 | 嫩草影院黄 | 一边顶弄一边接吻 | 国产精品久久久久免费 | 国产黄色大片在线观看 | www.18av| 国产精品一区二区久久久 | 一级免费黄色 | 国产a√精品区二区三区四区 | 国产又粗又猛又爽又黄的视频小说 | 国产精品毛片一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 韩国一区二区三区视频 | 久久作爱| 国产又大又粗又爽的毛片 | 丁香婷婷六月 | 国产精品区在线观看 | 色婷婷激情 | 色噜噜一区二区三区 | 叼嘿视频91 | 欧美另类高清 | 91国产视频在线播放 | 日日网站 | 少妇第一次交换又紧又爽 | 久久久久久久久久一区二区三区 | 成人国产在线观看 | 国产成人精品一区二区 | 婷婷在线网 | 国产精品一区二区入口九绯色 | 岳乳丰满一区二区三区 | 欧美成人综合色 | 禁网站在线观看免费视频 | 亚洲av无码成人精品国产 | 亚洲成av人片一区二区 | 欧美色悠悠 | 国产淫语| 91精品国产一区二区 | 亲嘴扒胸摸屁股免费视频日本网站 | 亚洲欧美视频在线播放 | 久久男| 爆操91| 久久久久久久久久久久久久久 | 牛牛在线 | 国产精品久久久久久久一区二区 | 91丝袜一区二区三区 | 国产网站在线看 | 91字幕网| 亚洲久热 | 波多野结衣潜藏淫欲 | 性欧美精品男男 | 男人天堂视频在线观看 | 一级片免费观看 | 国产一区二区在线观看视频 | 中国少妇毛片 | 亚洲av无码乱码国产精品 | 日韩av电影中文字幕 | 看片日韩 | 亚洲综合五月天婷婷丁香 | 少妇在军营h文高辣 | 操女人免费视频 | 成人免费一区二区 | 亚洲一区二区三区午夜 | 亚洲性天堂 | 亚洲AV成人午夜无码精品久久 | 中文字幕色哟哟 | 国产黄色片子 | 国产在线三区 | 靠逼网站在线观看 | 怡红院av在线 | 奇米网7777| 五月的婷婷 | 日本a在线 | 亚洲精品一区中文字幕乱码 |