C 紅黑樹(RBTree)的模擬實現

2021-09-25 14:54:12 字數 2554 閱讀 1302

#pragma once

enum colour;

templatestruct rbtreenode

};templatestruct __rbtreeiterator

ref operator*()

//ptr operator->()

// ptr operator->()

// ++it;

self& operator++()

} else

_node = parent;

} return *this;

} self operator++(int)

self& operator--();

self operator--(int);

bool operator != (const self& s) const

bool operator == (const self& s) const;

};templateclass rbtree

return iterator(cur);

} iterator end()

const_iterator begin() const

return const_iterator(cur);

} const_iterator end() const

pairinsert(const t& val)

keyofvalue kov;

node* parent = nullptr;

node* cur = _root;

while (cur)

else if (kov(cur->_val) > kov(val))

else

} cur = new node(val);

node* newnode = cur;

cur->_col = red;

if (kov(parent->_val) < kov(val))

else

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

else

rotater(grandfather);

parent->_col = black;

grandfather->_col = red;

break;}}

else

else

rotatel(grandfather);

parent->_col = black;

grandfather->_col = red;

break;}}

} _root->_col = black;

return make_pair(iterator(newnode), true);

} void rotatel(node* parent)

else

} void rotater(node* parent)

else

else

subl->_parent = pnode;

} }iterator find(const k& k)

else if (kov(cur->_val) > k)

else

} return end();

} bool isvalidrbtree()

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

size_t blackcount = 0;

node* pcur = proot;

while (pcur)

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

size_t k = 0;

return _isvalidrbtree(proot, k, blackcount);

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

return true;

} // 統計黑色節點的個數

if (black == proot->_col)

k++;

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

node* pparent = proot->_parent;

if (pparent && red == pparent->_col && red == proot->_col)

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

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

} void inorder()

void _inorder(node* root)

private:

node* _root = nullptr;

};

void testrbtree();

//int a = ;

for (auto e : a)

t.inorder();

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

}

C 模擬實現紅黑樹

enum color template classk,class v struct rbnode template classk,class v class rbtree bool insert const pair value 搜尋位置 pnode cur header parent pnode ...

平衡搜尋樹 紅黑樹RBTree

紅黑樹 紅黑樹是一顆二叉搜尋樹,它在每乙個節點上增加了乙個儲存位來表示節點的顏色,可以是red或是black。通過對任何一條從根到葉子簡單路徑上的顏色的約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似平衡。紅黑樹的性質 每個節點,不是紅色就是黑色 根節點是黑色 如果乙個節點是紅色的,那麼它的子...

紅黑樹(c實現)

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