平衡搜尋樹 紅黑樹RBTree

2021-08-17 21:05:47 字數 3472 閱讀 4969

紅黑樹

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

紅黑樹的性質

每個節點,不是紅色就是黑色;

根節點是黑色;

如果乙個節點是紅色的,那麼它的子節點都是黑色的;

對於每乙個節點,從該節點到其多有的後代葉子節點的簡單路徑上,均包含相同數目的黑色節點。 插入

cur為紅有兩種情況:

cur為新增節點

cur不是新增節點,而是cur的子樹新增節點,相當於調節完子樹後cur為紅,則需要再向上調整。

其中兩種情況比較簡單:

1.第一種情況:

樹為空,cur是新插入的節點,cur為紅,則需要將cur變為黑

2.第二種情況:
cur為紅,p為黑,所以整個樹的顏色都不用變

3. 第三種情況
cur為紅,g為黑,

p為紅,u存在且為紅.

調整後:

cur為紅,g改為紅,

p.u改為黑.

4. 第四種情況

cur為紅,g為黑,

p為紅,u不存在/u為黑.

調整後:

p.g變顏色—p變黑,

g變紅.

情況1:左單旋轉

情況2:右單旋轉

5. 第五種情況

cur為紅,g為黑,

p為紅,u不存在/u為黑.

1. 而p為g的左孩子,cur為p的右孩子,則需要對p先做出左單旋轉;

2. 而p為g的右孩子,cur為p的左孩子,則需要對p先做出右單旋轉;最後將情況轉為第二種情況。

}//找到位置 插入新節點鏈起來

cur =

new node(key,value);

if(parent

->_key > key)

else

//檢驗規則

//1. parent 不為黑且parent存在

//2. cur 為紅 parent為紅 uncle存在且為紅

//3. cur 為紅 parent為紅 uncle不存在或者存在為黑

while(parent

&&parent

->_col == red)

else

//uncle 不存在或者存在且為黑-----第三種情況

rotater(grandfather);}}

else

else

rotatel(grandfather);}}

}_root->_col = black;

return

true;

} void rotater(node*

parent) //右單旋轉

subl->_right =

parent;

parent

->_parent = subl;

if(ppnode ==

null)

else

if(ppnode->_left ==

parent)

else

parent

->_col = red;

subl->_col = black;

parent

= subl;

}void rotatel(node*

parent) //左單旋轉

subr->_left =

parent;

parent

->_parent = subr;

if(ppnode ==

null)

else

if(ppnode->_left ==

parent)

else

parent

->_col = red;

subr->_col = black;

parent

= subr;

}void inorder()

void _inorder(node* root)

_inorder(root->_left );

cout<_key>

" ";

_inorder(root->_right );

}bool isbalance()

int k =

0; node* cur = _root;

while(cur)

cur = cur->_left ;

}int blacknum =

0; return _isbalance(_root,k,blacknum);

}bool _isbalance(node* root,int k,int blacknum)

return

true;

}if(root->_col == red && (root->_parent)->_col == red)

if(root->_col == black)

return _isbalance(root->_left ,k,blacknum)&&_isbalance(root->_right ,k,blacknum);

}private:

node* _root;

};

C 紅黑樹(RBTree)的模擬實現

pragma once enum colour templatestruct rbtreenode templatestruct rbtreeiterator ref operator ptr operator ptr operator it self operator else node pare...

平衡二叉樹 紅黑樹

顏色調整,第一種情況uncle存在且為紅色,第二種和第三種情況,uncle不存在 uncle存在且為黑色,先處理第三種情況,針對parent進行左單旋。test.cpp include using namespace std enum colour template struct rbtreenod...

最簡單的平衡樹(紅 黑樹)的實現

在二叉搜尋樹 bst 的基礎上,要實現一顆平衡樹,可以使用2 3樹的方式,2 3樹的直接實現,相對比較複雜 因此演算法的研究者們提出了紅 黑樹的實現方式。package com.test public class redblacktree,value private boolean isred no...