C 紅黑樹的完整實現

2021-09-20 21:40:41 字數 2415 閱讀 7694

這裡只有紅黑樹實現的完整**,關於紅黑樹插入時變色的詳細過程,可參考我上篇部落格:紅黑樹中的內容。

#define _crt_secure_no_warnings 1

#include #pragma once

#include using namespace std;

enum color

;templatestruct rbstreenode

rbstreenode* _left;

rbstreenode* _right;

rbstreenode* _parent;

pair_kv;

color _col;

};templateclass rbtree

bool insert(const pair& kv)

//不為空,先找到插入位置再插入節點

node* parent = nullptr;

node* cur = _root;

while (cur)

//找到插入位置,插入節點

//插入的節點顏色為紅色,破壞紅黑樹的性質3,更好處理

cur = new node(kv);

cur->_col = red;

if (kv.first < parent->_kv.first)

else

//插入節點成功後,檢查紅黑樹的性質有沒有被破壞

//若是有則要進行節點的顏色調整以滿足紅黑樹性質

//若是父節點存在且父節點的顏色為紅色則需要調整,否則滿足紅黑樹性質

while (parent && parent->_col == red)

//2、叔叔節點不存在或者叔叔節點的顏色為黑色

else

//1、如果cur是parent的z左孩子,此時只需進行乙個右單旋,並將parent的顏色變為黑,grandparent的顏色置紅

rotater(grandfather);

grandfather->_col = red;

parent->_col = black;

break;}}

//2、父節點是祖父節點的右孩子

else

//2、叔叔節點不存在或者叔叔節點的顏色為黑色

else

//2、若是cur為parent的右孩子,進行乙個左單旋,並將parent的顏色變為黑,grandparent的顏色置紅

rotatel(grandfather);

grandfather->_col = red;

parent->_col = black;

break;}}

} //旋轉完成之後,將根節點的顏色置成黑色

_root->_col = black;

return true;

} void rotatel(node* parent)

else

else

}} //右單旋

void rotater(node* parent)

subl->_right = parent;

parent->_parent = subl;

if (parent == _root)

else

else

}} void inorder()

void _inorder(node* root)

bool isvalidrbtree()

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

size_t blackcount = 0;

node* pcur = proot;

while (pcur)

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

size_t k = 0;

return _isvalidrbtree(proot, k, blackcount);

} bool _isvalidrbtree(node* root, size_t k, const size_t blackcount)

// 如果root是因子節點,檢測當前路徑中黑色節點的個數是否有問題

if (nullptr == root->_left&& nullptr == root->_right)

}//遞迴判斷左右子樹都滿足紅黑樹的性質

return _isvalidrbtree(root->_left, k, blackcount) &&

_isvalidrbtree(root->_right, k, blackcount);

}private:

node* _root;

};void testrbtree()

; rbtreert;

for (auto& e : a)

cout << rt.isvalidrbtree() << endl;

rt.inorder();

}

紅黑樹的c實現完整原始碼

紅 黑樹c原始碼 實現與剖析 前言 紅黑樹作為一種經典而高階的資料結構,相信,已經被不少人實現過,但不是因為程式不夠完善而無法執行,就是因為程式完全沒有注釋,初學者根本就看不懂。此份紅黑樹的c原始碼最初從linux lib rbtree.c而來,後經一那誰 用c寫了出來。在此,向原作者表示敬意。但原...

紅黑樹C 完整版

這裡寫 片 異常類 ifndef except h define except h include using namespace std class d ception virtual d ception virtual string tostring const virtual string w...

紅黑樹(c實現)

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