這裡只有紅黑樹實現的完整**,關於紅黑樹插入時變色的詳細過程,可參考我上篇部落格:紅黑樹中的內容。
#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...