資料結構 紅黑樹

2021-07-24 05:05:25 字數 2961 閱讀 3846

紅黑樹是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是紅色也可以是黑色。通過對任何一條從根到葉子簡單路徑上的顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡。

紅黑樹滿足下面的性質

1 .   每個節點,不是紅色就是黑色的

2 .   根節點是黑色的

3 .   如果乙個節點是紅色的,則它的兩個子節點是黑色的

4 .   對每個節點,從該節點到其所有後代葉節點的簡單路徑上,均包含相同數目

5 .   每個葉子節點都是黑色的(這裡的葉子節點是指的null 節點(空節點))

紅黑樹的插入情況分析

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

另一種

rbtree.h

#include#includeusing namespace std;

enum colour

;templatestruct rbtreenode

};templateclass rbtree

~rbtree()

{} bool insert(const k& key,const v& vlaue)

node* cur=_root;

node* parent=null;

while (cur)

else if(cur->_key_right;

}else

return false;

} cur=new node(key,vlaue);

if (parent->_key>key)

else

while (cur!=_root&&parent->_col==red)

//else if(uncle==null||uncle->_col==black)

else

_rotator(grandfather);

parent->_col=black;

grandfather->_col=red;

cur=parent;

parent=cur->_parent;}}

else if (parent==grandfather->_right)//2、父節點為祖父節點的右孩子

//else if(uncle==null||uncle->_col==black)

else

_rotatol(grandfather);

parent->_col=black;

grandfather->_col=red;

cur=parent;

parent=cur->_parent;}}

}_root->_col=black;

return true;

} void inorder()

bool isbalance()

int blackcount=0;

return _isblance(_root,count,blackcount);//遞迴判斷每一條路徑上黑節點數是否正確

}protected:

void _rotatol(node* parent)

else if(ppnode->_left==parent)

else

}void _rotator(node* parent)

else if(ppnode->_left==parent)

else

}void _inorder(node* root)

bool _isblance(node* root,int count,int blackcount)

//用左右每一條路徑上的黑節點數

//與判斷數進行比較,相同為平衡,不同則為不平衡

node* parent=root->_parent;

if(parent&&(parent->_col==red&&root->_col==red))

return false;

if(root->_col==black)

blackcount++;

return _isblance(root->_left,count,blackcount)

&&_isblance(root->_right,count,blackcount);

}private:

node* _root;

};void testrbtree()

測試結果

資料結構 紅黑樹

紅黑樹是二叉排序樹的改進,紅黑樹有幾個特點 1 節點只有2中顏色,紅色和黑色。2 根節點一定是黑色節點。3 紅色節點的子節點一定是黑色節點。4 黑色高度 根節點到每個葉子節點的路徑長度包含相同的黑色節點 相等。規定的插入的節點一定是紅色節點,紅黑樹的插入節點後需要調整的規則,插入節點需要調整的情況有...

資料結構 紅黑樹

一 紅黑樹 紅黑樹 red black tree 是一種自平衡二叉查詢樹,是在 電腦科學中用到的一種 資料結構 典型的用途是實現 關聯陣列 可以保證最長路徑不超過最短路徑的2倍,近似平衡。二 性質 性質1.節點是紅色或黑色。性質2.根節點是黑色。性質3 每個葉節點 nil節點,空節點 是黑色的。性質...

資料結構 紅黑樹

資料結構之紅黑樹 一 什麼是紅黑樹?紅黑樹是一棵二叉搜尋樹,它在每個結點上增加了乙個儲存位來表示結點的顏色,可以是red或者black,通過對任何一條從根節點到葉子結點上的簡單路徑來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似平衡。二 紅黑樹滿足的條件?1.每個結點不是紅色就是黑色 2.根...