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