實現C 中的紅黑樹

2021-10-20 18:20:06 字數 3064 閱讀 1705

rbtree.h

#pragma once

#include

using

namespace std;

enum color

;template

<

class

t>

struct rbtreenode //紅黑樹節點

rbtreenode

* left;

rbtreenode

* right;

rbtreenode

* parent;

t data;

color color;};

template

<

class

t>

class

rbtree

bool

insert

(const t& data)

//如果樹非空先按照二叉搜尋樹的規則查詢要插入的節點位置

node* cur = root;

node* parent =

nullptr

;while

(cur)

//找到位置後按二叉搜尋樹規則插入節點

cur =

newnode

(data);if

(data < parent-

>data)

parent-

>left = cur;

else

parent-

>right = cur;

cur-

>parent = parent;

// 上述結構滿足紅黑樹的性質則不需要以下調整,若違反紅黑樹的性質則需要調整,分兩側處理,每側三種情況

while

(parent != head && red == parent-

>color)

else

//轉換成了情況二

parent-

>color = black;

grandfather-

>color = red;

rotateright

(grandfather);}

}else

//雙親在祖父節點的右子樹上

else

//轉換成了情況二

parent-

>color = black;

grandfather-

>color = red;

rotateleft

(grandfather);}

}}head-

>left =

mostleft()

;//頭節點的左指向最左邊的節點(最小的)

head-

>right =

mostright()

;//頭節點的右指向最右邊的節點(最大的)

root-

>color = black;

//控制根節點的顏色為黑,防止樹被汙染

return

true;}

void

inorder()

bool

isvalidrbtree()

// 獲取任意一條路徑中黑色節點的個數

size_t blackcount =0;

node* pcur = proot;

while

(pcur)

// 檢測是否滿足紅黑樹的性質,k用來記錄路徑中黑色節點的個數

size_t k =0;

return

_isvalidrbtree

(proot, k, blackcount);}

private

: node*

&getroot()

node*

mostleft()

node*

mostright()

void

rotateleft

(node* parent)

else

}void

rotateright

(node* parent)

else

}void

inorder

(node* root)

}bool

_isvalidrbtree

(node* proot, size_t k,

const size_t blackcount)

return

true;}

// 統計黑色節點的個數

if(black == proot-

>color)

k++;// 檢測當前節點與其雙親是否都為紅色

node* pparent = proot-

>parent;

if(pparent != head && red == pparent-

>color && red == proot-

>color)

return

_isvalidrbtree

(proot-

>left, k, blackcount)

&&_isvalidrbtree

(proot-

>right, k, blackcount);}

private

: node* head;};

void

testrbtree()

; rbtree<

int> t;

for(

auto e : a)

t.insert

(e);

t.inorder()

;if(t.isvalidrbtree()

)else

}

test.cpp

#include

"rbtree.h"

using

namespace std;

intmain()

執行結果

紅黑樹(c實現)

學習紅黑樹原理,網路上有很多文章。學習紅黑樹的具體實現,個人推薦去看jdk中的treemap原始碼。因為該原始碼很簡潔,並且很容易改為其它語言的實現,最重要的是該份實現得到世人的認可,可以保證是沒問題的 下面是我根據其實現,使用c語言改寫的紅黑樹實現,目前只有紅黑樹的插入實現。include inc...

紅黑樹C 實現

完整實現了一遍紅黑樹,程式就當作自己的筆記好了 紅黑樹,顧名思義,就是紅黑相間的樹,它借由紅黑規則實現了二叉排序樹的平衡。紅黑規則如下 1.每個節點不是紅就是黑 2.根總是黑色 3.若節點為紅色,它的子節點必須為黑色 4.從根到葉的每條路徑,必須包含相同數目的黑色節點 插入和刪除節點時都要遵循紅黑規...

紅黑樹的C 實現

ifndef rbtree h define rbtree h include using namespace std define red 0 define black 1 template typename t class treenode treenode t value constructo...