資料結構之紅黑樹
一.什麼是紅黑樹?
紅黑樹是一棵二叉搜尋樹,它在每個結點上增加了乙個儲存位來表示結點的顏色,可以是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 如果乙個節點是紅色的...