完整實現了一遍紅黑樹,程式就當作自己的筆記好了
紅黑樹,顧名思義,就是紅黑相間的樹,它借由紅黑規則實現了二叉排序樹的平衡。
紅黑規則如下:
1.每個節點不是紅就是黑
2.根總是黑色
3.若節點為紅色,它的子節點必須為黑色
4.從根到葉的每條路徑,必須包含相同數目的黑色節點
插入和刪除節點時都要遵循紅黑規則,具體表現如下:
1.首先所有新插入的節點都為紅色
2.若新插入的節點的父節點為紅色,則必須對紅黑樹進行調整
(1)旋轉
單旋**插入節點為外部子孫節點
雙旋**插入節點為內部子孫節點
(2)改變顏色
3.有兩個紅色子節點的節點也要進行處理
自己變紅,兒子都變黑
上面只是對紅黑樹的乙個簡單概述,具體學習還要看演算法書,下面是紅黑樹的**實現。
對紅黑樹進行中序遍歷即可得到遞增的序列,故紅黑樹是有序的。
rb_tree.h
#ifndef rb_tree_h_
#define rb_tree_h_
templateclass redblacktree;
templateclass redblacknode;
templateclass redblacktree
; //利用列舉表示兩種顏色
typedef redblacknodenode;
bool isempty() const;
void makeempty();
bool find(const compareble & x) const;
void insert(const compareble & x);
//private:
node *header; //頭節點
node *nullnode; //空節點
node *current;
node *parent; //父節點
node *grand; //祖父節點
node *great; //曾祖父節點
void reclaimmemory(node *t) const;
void rotatewithleftchild(node * &k2) const;
void rotatewithrightchild(node * &k1) const;
void doublerotatewithleftchild(node * &k3) const;
void doublerotatewithrightchild(node * &k1) const;
void handlereorient(const compareble &item);
redblacknode* rotate(const compareble & item, node *theparent) const;
};//紅黑樹節點
templateclass redblacknode
friend class redblacktree; //將紅黑樹作為友元類用於操作私有物件
};templateredblacktree::redblacktree(const compareble & neginf)
templateredblacktree::~redblacktree()
//向紅黑樹中插入資料,在插入過程中需要實現自動平衡
templatevoid redblacktree::insert(const compareble & x)
if (current != nullnode)
throw "element repeat!";
current = new node(x, nullnode, nullnode);
if (x < parent->element)
parent->left = current;
else
parent->right = current;
//對於新插入節點也要進行處理
handlereorient(x);
}//向右旋轉
templatevoid redblacktree::rotatewithleftchild(node * &k2) const
//向左旋轉
templatevoid redblacktree::rotatewithrightchild(node * &k1) const
//向右雙旋轉
templatevoid redblacktree::doublerotatewithleftchild(node * &k3) const
//向左雙旋轉
templatevoid redblacktree::doublerotatewithrightchild(node * &k1) const
//根據紅黑規則調整紅黑樹
templatevoid redblacktree::handlereorient(const compareble &item)
//根節點必須黑色
header->right->color = black;
}//根據內容自動判斷旋轉方向:
//左子樹向右轉->ll
//左子樹向左轉->lr
//右子樹向右轉->rl
//右子樹向左轉->rr
//引數1:當前節點資料,引數2:祖父節點(應比當前item大兩輩)
templateredblacknode* redblacktree::rotate(const compareble & item, node *theparent) const
else //右子樹 }
//判斷紅黑樹是否為空
templatebool redblacktree::isempty() const
//清空紅黑樹
templatevoid redblacktree::makeempty()
templatevoid redblacktree::reclaimmemory(node *t) const
}//清空紅黑樹
templatebool redblacktree::find(const compareble & x) const
}#endif
rb_tree.cpp
//紅黑樹實現
#include #include "rb_tree.h"
using namespace std;
int main()
紅黑樹(c實現)
學習紅黑樹原理,網路上有很多文章。學習紅黑樹的具體實現,個人推薦去看jdk中的treemap原始碼。因為該原始碼很簡潔,並且很容易改為其它語言的實現,最重要的是該份實現得到世人的認可,可以保證是沒問題的 下面是我根據其實現,使用c語言改寫的紅黑樹實現,目前只有紅黑樹的插入實現。include inc...
紅黑樹實現
紅黑樹 是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...
紅黑樹實現
按演算法導論裡的偽 用c 實現了紅黑樹。實現過程中,參考了nginx的紅黑樹實現,特別是右旋的實現,演算法導論裡沒有給出,就借鑑了nginx的實現。對比了nginx的紅黑樹實現和演算法導論裡的偽 插入基本上一樣的,刪除兩者有點差別,但思路應該是一樣的。實現過程中需要注意的是,空葉子結點一定要實現,不...