红黑树的创建

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;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向前走()

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值