資料結構 紅黑樹

2021-07-15 03:32:29 字數 2959 閱讀 9382

一、紅黑樹

紅黑樹(red black tree) 是一種自平衡二叉查詢樹,是在

電腦科學中用到的一種

資料結構

,典型的用途是實現

關聯陣列

。可以保證最長路徑不超過最短路徑的2倍,近似平衡。

二、性質

性質1. 節點是紅色或黑色。

性質2. 根節點是黑色。

性質3 每個葉節點(nil節點,空節點)是黑色的。

性質4 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)

性質5. 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

三、實現**:

(1) 插入新的節點:

第一種情況:cur(新)為紅,p(父)為紅,g(祖)為黑,u(叔)存在且為紅;-------->p變為黑,g為紅,u為黑

第二種情況:cur(新)為紅,p(父)為紅,g(祖)為黑,u(叔)不存在或者u為黑;-------->p變為黑,g為紅,u為黑

第三種情況:cur(n)為紅,p為紅,g為黑,u不存在或者u為黑;------>旋轉為第二種情況,交換n和p節點。

(2)判斷是否平衡

判斷是否出現連續紅色的情況;

判斷各支路是否黑色節點相等;

(3)實現如下:

#pragma once

#includeusing namespace std;

enum color;

templatestruct rbtreenode

rbtreenode* _left;

rbtreenode* _right;

rbtreenode* _parent;

k _key;

v _value;

color _col;

};templateclass rbtree

void insert(k key,v value)

node* cur=_root;

node* parent=null;

while(cur)

else if(cur->_key_right;

} if(parent->_key>key)

else if(parent->_key_right=new node(key,value);

parent->_right->_parent=parent;

cur=parent->_right;

} //_root->_col=black;

//第一種情況:cur為紅,p為紅,g為黑,u不存在或者為紅

while(cur!=_root&&parent->_col==reb)

else

parent->_col=black; //第二種情況:

grandfather->_col=reb;

rotater(grandfather); //以grandfather為軸右旋

break;}}

else

else

//第二種情況

parent->_col=black;

grandfather->_col=reb;

rotatel(grandfather);

break;//以grandfather為軸左旋}}

} _root->_col=black;

}bool isbalance()

cur=cur->_left;

} int count=0;

return _isbalance(_root,key,count);

} void inorder()

private:

void rotatel(node* parent)

else

parent->_right=null;

if(ppnode&&ppnode->_left==parent)

else if(ppnode&&ppnode->_right==parent)

else if(ppnode==null)

}void rotater(node* parent)

else

parent->_left=null;

if(ppnode&&ppnode->_left==parent)

else if(ppnode&&ppnode->_right==parent)

else if(ppnode==null)

}void _inorder(node* root)

_inorder(root->_left);

cout<_key>";

_inorder(root->_right);

} bool _isbalance(node* root,int key,int count)

if(root->_col==reb&&root->_parent->_col==reb)

if(root->_left==null&&root->_right==null&&key!=count)

private:

node* _root;

};

#include"rbtree.h"

int main()

; for(int i=0;i

{ //cout<

4、結果:

資料結構 紅黑樹

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

資料結構 紅黑樹

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

資料結構 紅黑樹

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