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