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...