1.紅黑樹的概念:紅黑樹是一棵二叉搜尋樹,它在每個節點上增加乙個儲存位來表示節點的顏色,可以是red或black,通過對任何一條從根節點到葉子節點上的間單路徑來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近視平衡。
2.紅黑樹的性質
滿足上訴性質的二叉搜尋樹是二叉搜尋樹
3.具體插入節點的步驟:
對於插入節點的雙親節點是紅色時,我們又分為三種情況對其調整
4.根據上述的五種情況,實現**
#include
#include
using namespace std;
enum color;
template
struct rbtreenode
rbtreenode* _pleft;
rbtreenode* _pright;
rbtreenode* _pparent;
k _key;
v _value;
color _color;
};template
class rbtree
bool insert(const k& key,const v& value)
void inorder()
bool checkrbtree()
int blackcount =
0; node* pcur = _proot;
while(pcur)
int k =
0; return _checkrbtree(_proot,blackcount,k);
}private:
bool _checkrbtree(node* proot,int blackcount,int k)
if(proot->_pleft ==
null
&& proot->_pright ==
null)
}return _checkrbtree(proot->_pleft,blackcount,k)&&_checkrbtree(proot->_pright,blackcount,k);
}void _inorder(node* proot)
bool _insert(const k& key,const v& value)
//找到要節點刪除的位置
node* pnode = _proot;
node* pparent =
null;
while(pnode)
else
if(pnode->_key < key)
else
}//已經找到
pnode =
new node(key,value);
if(pparent->_key > key)
else
//對紅黑樹進行調整
while(pparent && pparent->_color == red && pnode->_color == red)
else
//在處理情況三的過程中順便處理情況二
grandfather->_color = red;
pparent->_color = black;
_rotater(grandfather);}}
else
//在處理情況三的過程中順便處理情況二
else
grandfather->_color = red;//情況二
pparent->_color = black;
_rotatel(grandfather);}}
}_proot->_color = black;
}void _rotatel(node*& pparent)
void _rotater(node*& pparent)
private:
node* _proot;
};
測試**:
void funtest()
; for(size_t idx=0; idx
rbt.insert(array[idx],array[idx]);
rbt.inorder();
if(rbt.checkrbtree())
紅黑二叉樹節點的插入
進行紅黑樹節點的插入時候我們必須結合紅黑樹的性質,要不是真的很容易忙半天卻發現寫的 漏洞百出不符合紅黑樹的性質 每個結點不是紅色就是黑色 根節點是黑色的 如果乙個節點是紅色的,則它的兩個孩子結點是黑色的 對於每個結點,從該結點到其所有後代葉結點的簡單路徑上,均 包含相同數目的黑色結點 每個葉子結點都...
紅黑二叉查詢樹
擷取自 演算法 第四版 紅黑二叉查詢樹背後的基本思想是用標準二叉查詢樹 完全 由2 節點構成 和 一些額外的資訊 替換 3 節點 來表示 2 3樹。紅黑樹中的鏈結分為兩種 1 將兩個2 節點連線起來 構成3 節點的紅鏈結 2 2 3樹中的普通鏈結為黑鏈結 將兩個 2節點用左斜的紅色鏈結鏈起來可表示3...
紅黑二叉樹
紅黑二叉樹 紅黑二叉樹的基本思想是想用標準的二叉查詢樹 完全由2 結點構成 和一些額外的資訊 替換3 結點 來表述2 3樹。或者說,我們將3 結點表示為由一條左斜的紅色鏈結相 兩個2 結點其中之一是另乙個的左子節點 連的兩個2 結點。這種表示的優點 我們無需修改就可以直接使用標準二叉查詢樹的get ...