enum Colour {
BLCAK,
RED
};
template<class K,class V>
struct TreeNode {
struct TreeNode<K, V>* _left, * _right, * _parent;
pair<K, V>_kv;
Colour _col;
TreeNode(pair<K,V>kv):_left(nullptr),_right(nullptr),_parent(nullptr)
,_kv(kv)
,_col(RED){}
};
template<class K,class V>
class RET {
typedef struct TreeNode<K,V> node;
public:
bool insert(pair<K, V>&kv) {
if (_root == nullprt) {
_root = new node(kv);
_root->_col = BLCAK;
return true;
}
node* cur = _root;
node* parent = _root;
while (cur) {
if (cur->_kv.first <kv.first) {
parent = cur;
cur = cur->_right;
}
else if (cur->_kv.first > kv.first) {
parent = cur;
cur = cur->_left;
}
else {
return false;
}
}
if (parent->_kv.first > cur->_kv.first) {
parent->_left = cur;
cur->_parent = parent;
}
else if(parent->_kv.first<=cur->_kv.first) {
parent->_right = cur;
cur->_parent = parent;
}
cur->_col = RED;
while (parent&&parent->_col==RED) {
node* grandfather = parent->_parent;
if (grandfather->_left = parent) {
node* uncle = grandfather->_right;
if (uncle&&uncle->_col == RED) {
uncle->_col = parent->_col = RED;
grandfather->_col = BLCAK;
//继续往上调整
cur = parent;
parent = grandfather;
}
else {
if (cur==parent->_left) {
RouteR(grandfather);
//调整颜色
grandfather->_col = RED;
parent->_col = BLACK;
}
else {
RouteLR(grandfather);
grandfather->_col = RED;
parent->_col = BLACK;
}
break;
}
}
else {
node* uncle = grandfather->_left;
if (uncle && uncle->_col == RED) {
uncle->_col = parent->_col = RED;
grandfather = BLCAK;
//继续往上调整
cur = parent;
parent = grandfather;
}
else {
if (cur == parent->_left) {
RouteL(grandfather);
//调整颜色
grandfather->_col = RED;
parent->_col = BLACK;
}
else {
RouteRL(grandfather);
grandfather->_col = RED;
parent->_col = BLACK;
}
break;
}
}
}
_root->_col = BLCAK;
return true;
}
private:
node* _root = nullptr;
};
红黑树的创建
最新推荐文章于 2024-09-05 11:47:24 发布