紅黑樹:
是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的
顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡(由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個黑的插入乙個紅的節點,所以最長路徑為兩倍)
。它主要滿足以下幾個性質:
1. 每個節點,不是紅色就是黑色的;
2. 根節點是黑色的;
3. 如果乙個節點是紅色的,則它的兩個子節點是黑色的;
4. 對每個節點,從該節點到其所有後代葉節點的簡單路徑上,均包含相同數目的黑色節點。
在這裡主要實現紅黑樹的插入:插入時要滿足紅黑樹的性質,方便下保證黑節點個數不變情況,只能插入紅節點,然後則只需考慮是否紅節點連續這一種情況,若連續,則進行調整。
插入紅節點主要調整情況如下:
ps:cur為當前節點,p為父節點,g為祖父節點,u為叔叔節點
1.第一種情況cur為紅,p為紅,g為黑,u
存在且為紅
則將p,u改為黑,g改為紅,然後把g當成cur,繼續向上調整。
2.第二種情況(單旋)
cur為紅,p為紅,g為黑,u
不存在/u為黑
p為g的左孩子,
cur為
p的左孩子,則進行右單旋轉;相反,p為g
的右孩子,
cur為
p的右孩子,則進行左單旋轉p、g變色--p變黑,g變紅
3.第三種情況(雙旋)
cur為紅,p為紅,g為黑,u
不存在/u為黑
p為g的左孩子,
cur為
p的右孩子,則針對p做左單旋轉;相反,p為g
的右孩子,
cur為
p的左孩子,則針對p做右單旋轉則轉換成了情況2
其中還有兩種情況及樹為空或父節點為黑色則直接插入或不處理無影響。
**實現:並實現功能測試是否為紅黑樹**isbalance()
enum colour
;templatestruct rbtreenode
};templateclass rbtree
bool insret(const k& key,const v& value)
//不為空找插入位置
node* cur=_root;
node* parent=null;
while(cur)
//找到插入位置插入新結點
cur=new node(key,value);
if(parent->_key>key)
else
//若父節點存在且為紅色
while(parent&&parent->_col==red)
//2、3.叔叔結點不存在或叔叔結點為黑色時
else
rotater(grandfather);
grandfather->_col=red;
parent->_col=black;
break;}}
else
//2、3.叔叔結點不存在或叔叔結點為黑色時
else
rotatel(grandfather);
grandfather->_col=red;
parent->_col=black;
break;}}
} _root->_col=black;
return true;
} bool isbalance()//判斷是否為紅黑樹
size_t num=0;
return cheakcolour(_root)&&cheakblacknum(_root,k,num);
} void inorder()
//檢測各路徑黑色節點個數是否相等
bool cheakblacknum(node* root,size_t k,size_t num)
void _inorder(node* root)
void _destroy(node* root)
private:
void rotatel(node* parent)
else
}void rotater(node* parent)
else
}private:
node* _root;
};
測試**:
#include #include #include "rbtree.h"
using namespace std;
void testrbtree()
; //int arr=;
for(int i=0;i
紅黑樹實現
按演算法導論裡的偽 用c 實現了紅黑樹。實現過程中,參考了nginx的紅黑樹實現,特別是右旋的實現,演算法導論裡沒有給出,就借鑑了nginx的實現。對比了nginx的紅黑樹實現和演算法導論裡的偽 插入基本上一樣的,刪除兩者有點差別,但思路應該是一樣的。實現過程中需要注意的是,空葉子結點一定要實現,不...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...