紅黑樹C 實現

2021-08-20 05:30:31 字數 3234 閱讀 1779

完整實現了一遍紅黑樹,程式就當作自己的筆記好了

紅黑樹,顧名思義,就是紅黑相間的樹,它借由紅黑規則實現了二叉排序樹的平衡。

紅黑規則如下:

1.每個節點不是紅就是黑

2.根總是黑色

3.若節點為紅色,它的子節點必須為黑色

4.從根到葉的每條路徑,必須包含相同數目的黑色節點

插入和刪除節點時都要遵循紅黑規則,具體表現如下:

1.首先所有新插入的節點都為紅色

2.若新插入的節點的父節點為紅色,則必須對紅黑樹進行調整

(1)旋轉

單旋**插入節點為外部子孫節點

雙旋**插入節點為內部子孫節點

(2)改變顏色

3.有兩個紅色子節點的節點也要進行處理

自己變紅,兒子都變黑

上面只是對紅黑樹的乙個簡單概述,具體學習還要看演算法書,下面是紅黑樹的**實現。

對紅黑樹進行中序遍歷即可得到遞增的序列,故紅黑樹是有序的。

rb_tree.h

#ifndef rb_tree_h_

#define rb_tree_h_

templateclass redblacktree;

templateclass redblacknode;

templateclass redblacktree

; //利用列舉表示兩種顏色

typedef redblacknodenode;

bool isempty() const;

void makeempty();

bool find(const compareble & x) const;

void insert(const compareble & x);

//private:

node *header; //頭節點

node *nullnode; //空節點

node *current;

node *parent; //父節點

node *grand; //祖父節點

node *great; //曾祖父節點

void reclaimmemory(node *t) const;

void rotatewithleftchild(node * &k2) const;

void rotatewithrightchild(node * &k1) const;

void doublerotatewithleftchild(node * &k3) const;

void doublerotatewithrightchild(node * &k1) const;

void handlereorient(const compareble &item);

redblacknode* rotate(const compareble & item, node *theparent) const;

};//紅黑樹節點

templateclass redblacknode

friend class redblacktree; //將紅黑樹作為友元類用於操作私有物件

};templateredblacktree::redblacktree(const compareble & neginf)

templateredblacktree::~redblacktree()

//向紅黑樹中插入資料,在插入過程中需要實現自動平衡

templatevoid redblacktree::insert(const compareble & x)

if (current != nullnode)

throw "element repeat!";

current = new node(x, nullnode, nullnode);

if (x < parent->element)

parent->left = current;

else

parent->right = current;

//對於新插入節點也要進行處理

handlereorient(x);

}//向右旋轉

templatevoid redblacktree::rotatewithleftchild(node * &k2) const

//向左旋轉

templatevoid redblacktree::rotatewithrightchild(node * &k1) const

//向右雙旋轉

templatevoid redblacktree::doublerotatewithleftchild(node * &k3) const

//向左雙旋轉

templatevoid redblacktree::doublerotatewithrightchild(node * &k1) const

//根據紅黑規則調整紅黑樹

templatevoid redblacktree::handlereorient(const compareble &item)

//根節點必須黑色

header->right->color = black;

}//根據內容自動判斷旋轉方向:

//左子樹向右轉->ll

//左子樹向左轉->lr

//右子樹向右轉->rl

//右子樹向左轉->rr

//引數1:當前節點資料,引數2:祖父節點(應比當前item大兩輩)

templateredblacknode* redblacktree::rotate(const compareble & item, node *theparent) const

else //右子樹 }

//判斷紅黑樹是否為空

templatebool redblacktree::isempty() const

//清空紅黑樹

templatevoid redblacktree::makeempty()

templatevoid redblacktree::reclaimmemory(node *t) const

}//清空紅黑樹

templatebool redblacktree::find(const compareble & x) const

}#endif

rb_tree.cpp

//紅黑樹實現

#include #include "rb_tree.h"

using namespace std;

int main()

紅黑樹(c實現)

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

紅黑樹實現

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

紅黑樹實現

按演算法導論裡的偽 用c 實現了紅黑樹。實現過程中,參考了nginx的紅黑樹實現,特別是右旋的實現,演算法導論裡沒有給出,就借鑑了nginx的實現。對比了nginx的紅黑樹實現和演算法導論裡的偽 插入基本上一樣的,刪除兩者有點差別,但思路應該是一樣的。實現過程中需要注意的是,空葉子結點一定要實現,不...