資料結構 紅黑樹

2021-07-31 21:33:19 字數 3791 閱讀 9836

資料結構之紅黑樹

一.什麼是紅黑樹?

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

二.紅黑樹滿足的條件?

1. 每個結點不是紅色就是黑色

2. 根節點是黑色的

3. 如果乙個根節點是紅色的,則它的兩個葉子結點是黑色的(沒有兩個連續的紅色結點)

4. 對於每個結點,從該結點到其所有後代葉結點的簡單路徑上,均包含相同數目的黑色結點(每條路徑上黑色結點的數量相等)

三.紅黑樹的插入操作詳解

紅黑樹的情況分類

【情況一】

cur為紅,p為紅,g為黑,u存在且為紅

則將p,u改為黑,g改為紅,然後把g當成cur,繼續向上調整。

【情況二】

cur為紅,p為紅,g為黑,u不存在/u為黑

p為g的左孩子,cur為p的左孩子,則進行右單旋轉;相反,p為g的右孩子,cur

為p的右孩子,則進行左單旋轉

p、g變色--p變黑,g變紅

【情況三】

cur為紅,p為紅,g為黑,u不存在/u為黑

p為g的左孩子,cur為p的右孩子,則針對p做左單旋轉;相

反,p為g的右孩子,cur為p的左孩子,則針對p做右單旋轉

則轉換成了情況2

具體如下圖:

左單旋以及右單旋操作請見平衡二叉樹:

判斷此樹是否為平衡二叉樹:

要滿足上述條件

0.      如果根為空則就為平衡二叉樹

1.      兩個紅色結點不能相連

2.      從根節點到任意葉子節點的黑色結點數目必須相同

bool checkrbtree()

//計算黑色結點的個數 應該每一條路徑上數目都相同

int blackcount = 0;

node* pcur = _proot;

//只走最左邊的那一條路

while (pcur)

int k = 0;

return _checkrbtree(_proot,blackcount,k);

} bool _checkrbtree(node* proot,const size_t blackcount,size_t k)

//判斷是否k=blackcount

//如果此時為黑色結點 k要++

if (proot->_color == black)

k++;

if (proot->_pleft == null && proot->_pright == null)

}return _checkrbtree(proot->_pleft, blackcount, k) && _checkrbtree(proot->_pright, blackcount, k);

}

總**:

brtree.cpp

#pragma once  

#include using namespace std;

enum color

;templatestruct rbtreenode

v _value;

k _key;

rbtreenode* _pleft;

rbtreenode* _pright;

rbtreenode* _pparent;

color _color;

};template < class k, class v>

class rbtree

bool insert(const k& key, const v& value)

node* pcur = _proot;

node* pparent = null;

//找插入位置  

while (pcur)

else if (key < pcur->_key)

else

return false;

}//插入結點  

pcur = new node(key, value);

if (key < pparent->_key)

pparent->_pleft = pcur;

else if (key > pparent->_key)

pparent->_pright = pcur;

pcur->_pparent = pparent;

//對結點的顏色進行處理  

//從下往上修改顏色 到根節點且根節點為紅結束  

while (_proot != pcur && pparent->_color == red)

//否則叔叔不存在 或者叔叔為黑  

else

//否則只右單旋  

pparent->_color = black;

grandfather->_color = red;

rotateright(grandfather);}}

//否則父母結點在祖先節點的右邊  

else

else

grandfather->_color = red;

pparent->_color = black;

rotateleft(grandfather);}}

}//最後要把根節點換成黑色的  

_proot->_color = black;

return true;

}bool checkrbtree()

//計算黑色結點的個數 應該每一條路徑上數目都相同  

int blackcount = 0;

node* pcur = _proot;

//只走最左邊的那一條路  

while (pcur)

int k = 0;

return _checkrbtree(_proot, blackcount, k);

}bool _checkrbtree(node* proot, const size_t blackcount, size_t k)

//判斷是否k=blackcount  

//如果此時為黑色結點 k要++  

if (proot->_color == black)

k++;

if (proot->_pleft == null && proot->_pright == null)

}return _checkrbtree(proot->_pleft, blackcount, k) && _checkrbtree(proot->_pright, blackcount, k);

}void inorder()

private:

void _inorder(node* proot)

void rotateleft(node*& proot)

void rotateright(node*& proot)

private:

node* _proot;

};

資料結構 紅黑樹

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

資料結構 紅黑樹

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

資料結構 紅黑樹

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