C++实现简单的红黑树

红黑树简单介绍

红黑树是带有颜色属性的自平衡二叉查找树。对红黑树的操作在最坏情形下花费O(logN)时间,红黑树的高度最多是2log(N+1)。

红黑树是具有下列着色性质的二叉查找树:
1、每一个节点或者着成红色,或者着成黑色;
2、根是黑色的;
3、如果一个节点是红色的,那么它的子节点必须是黑色的;
4、从一个节点到一个NULL指针的每一条路径必须包含相同数目的黑色节点。

作者:下午茶609 来源:CSDN 原文:https://blog.csdn.net/u013565099/article/details/77731726
版权声明:本文为博主原创文章,转载请附上博文链接!

红黑树等价于2-3树

以下C++实现添加功能。

代码由AVL修改而来。

#define _CRK_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
using namespace std;

int max(int a, int b) {
	return a > b ? a : b;
}
static bool RED = true;
static bool BLACK = false;

template<class K, class V>
class Node
{
public:
	K key;
	V value;
	int height;
	Node* left;
	Node* right;
	bool color;
	Node() {
		this->height = 0;
		this->left = NULL;
		this->right = NULL;
		color = RED;
	}
	Node(K key, V value) {
		this->key = key;
		this->value = value;
		this->height = 1;
		color = RED;
		this->left = NULL;
		this->right = NULL;
	}
};


template<class K, class V>
class RBT {
public:
	RBT() {
		root = NULL;
		size = 0;
	}
	int Size() {
		return size;
	}

	int GetHeight(Node<K, V>* node) {
		if (node == NULL) {
			return 0;
		}
		return node->height;
	}
	int Height() {
		return GetHeight(root);
	}
	int GetBalanceFactor(Node<K, V>* node) {
		if (node == NULL) {
			return 0;
		}
		return GetHeight(node->left) - GetHeight(node->right);
	}
	bool IsBST() {
		vector<K> keys;
		InOrder(root, keys);
		for (int i = 1; i < (int)keys.size(); i++) {
			if (keys[i - 1] > keys[i]) {
				return false;
			}
		}
		return true;
	}
	void InOrder(Node<K, V>* node, vector<K> keys) {
		if (node == NULL) {
			return;
		}
		InOrder(node->left, keys);
		keys.push_back(node->key);
		InOrder(node->right, keys);
	}
	bool IsBalanced() {
		return IsBalanced(root);
	}
	bool IsBalanced(Node<K, V>* node) {
		if (node == NULL) {
			return true;
		}
		int bf = GetBalanceFactor(node);
		if (abs(bf) > 1) {
			return false;
		}
		return IsBalanced(node->left) && IsBalanced(node->right);
	}

	void add(K key, V value) {
		root = add(root, key, value);
		root->color = BLACK;
	}
	bool Contains(K key) {
		return GetNode(root, key) != NULL;
	}

	Node<K, V>* GetNode(Node<K, V>* node, K key) {
		if (node == NULL) {
			return NULL;
		}
		if (key == node->key) {
			return node;
		}
		else if (key < node->key) {
			return GetNode(node->left, key);
		}
		else {
			return GetNode(node->right, key);
		}
	}
	V Get(K key) {
		Node<K, V>* node = GetNode(root, key);
		return node == NULL ? NULL : node->value;
	}
	void set(K key, V value) {
		Node<K, V>* node = GetNode(root, key);
		if (node == NULL) {
			return;
		}
		node->value = value;
	}
	Node<K, V>* minimum(Node<K, V>* node) {
		if (node->left == NULL) {
			return node;
		}
		return minimum(node->left);
	}
	K minimumKey() {
		return minimum(root)->key;
	}

	void preOrder()
	{
		preOrder(root);
	}
	void inOrder()
	{
		inOrder(root);
	}
	void postOrder()
	{
		postOrder(root);
	}

private:
	bool IsRed(Node<K, V>*node) {
		if (node == NULL) {
			return BLACK;
		}
		return node->color;
	}

	void FlipColors(Node<K, V>*node) {
		node->color = RED;
		node->left->color = BLACK;
		node->right->color = BLACK;
	}

	void preOrder(Node<K, V>*node) const
	{
		if (node != NULL)
		{
			cout << node->key << "," << node->value << ";";
			preOrder(node->left);
			preOrder(node->right);
		}
	}
	void inOrder(Node<K, V>*node) const
	{
		if (node != NULL)
		{
			inOrder(node->left);
			cout << node->key << "," << node->value << ";";
			inOrder(node->right);
		}
	}
	void postOrder(Node<K, V>*node) const
	{
		if (node != NULL)
		{
			postOrder(node->left);
			postOrder(node->right);
			cout << node->key << "," << node->value << ";";
		}
	}



	//node为根
	Node<K, V>* add(Node<K, V>* node, K e, V value) {
		if (node == NULL) {
			size++;
			return new Node<K, V>(e, value);
		}
		else if (e < node->key) {
			node->left = add(node->left, e, value);
		}
		else if (e > node->key) {
			node->right = add(node->right, e, value);
		}
		else {
			node->value = value;
		}
		if (IsRed(node->right) && !IsRed(node->left)) {
			node = LeftRotate(node);
		}
		if (IsRed(node->left) && IsRed(node->left->left)) {
			node = RightRotate(node);
		}
		if (IsRed(node->left) && IsRed(node->right)) {
			FlipColors(node);
		}
		node->height = 1 + max(GetHeight(node->left), GetHeight(node->right));
		int balancefactor = GetBalanceFactor(node);
		if (abs(balancefactor) > 1) {
			cout << balancefactor << endl;
		}
		return node;
	}
	Node<K, V>* RightRotate(Node<K, V>* node) {
		Node<K, V>* x = node->left;
		//右旋转
		node->left = x->right;
		x->right = node;
		x->color = node->color;
		node->color = RED;
		return x;
	}
	Node<K, V>* LeftRotate(Node<K, V>* node) {
		Node<K, V>* x = node->right;
		//左旋转
		node->right = x->left;
		x->left = node;
		x->color = node->color;
		node->color = RED;
		return x;
	}

private:
	Node<K, V>* root;
	int size;
};

template<class K, class V>
class AVLT {
public:
	AVLT() {
		root = NULL;
		size = 0;
	}
	int Size() {
		return size;
	}

	int GetHeight(Node<K, V>* node) {
		if (node == NULL) {
			return 0;
		}
		return node->height;
	}
	int Height() {
		return GetHeight(root);
	}
	int GetBalanceFactor(Node<K, V>* node) {
		if (node == NULL) {
			return 0;
		}
		return GetHeight(node->left) - GetHeight(node->right);
	}
	bool IsBST() {
		vector<K> keys;
		InOrder(root, keys);
		for (int i = 1; i < (int)keys.size(); i++) {
			if (keys[i - 1] > keys[i]) {
				return false;
			}
		}
		return true;
	}
	void InOrder(Node<K, V>* node, vector<K> keys) {
		if (node == NULL) {
			return;
		}
		InOrder(node->left, keys);
		keys.push_back(node->key);
		InOrder(node->right, keys);
	}
	bool IsBalanced() {
		return IsBalanced(root);
	}
	bool IsBalanced(Node<K, V>* node) {
		if (node == NULL) {
			return true;
		}
		int bf = GetBalanceFactor(node);
		if (abs(bf) > 1) {
			return false;
		}
		return IsBalanced(node->left) && IsBalanced(node->right);
	}

	void add(K key, V value) {
		root = add(root, key, value);
	}
	bool Contains(K key) {
		return GetNode(root, key) != NULL;
	}

	Node<K, V>* GetNode(Node<K, V>* node, K key) {
		if (node == NULL) {
			return NULL;
		}
		if (key == node->key) {
			return node;
		}
		else if (key < node->key) {
			return GetNode(node->left, key);
		}
		else {
			return GetNode(node->right, key);
		}
	}
	V Get(K key) {
		Node<K, V>* node = GetNode(root, key);
		return node == NULL ? NULL : node->value;
	}
	void set(K key, V value) {
		Node<K, V>* node = GetNode(root, key);
		if (node == NULL) {
			return;
		}
		node->value = value;
	}
	Node<K, V>* minimum(Node<K, V>* node) {
		if (node->left == NULL) {
			return node;
		}
		return minimum(node->left);
	}
	K minimumKey() {
		return minimum(root)->key;
	}
	V Remove(K key) {
		Node<K, V>* node = GetNode(root, key);
		if (node != NULL) {
			root = Remove(root, key);
			return node->value;
		}
		return NULL;
	}

	void preOrder()
	{
		preOrder(root);
	}
	void inOrder()
	{
		inOrder(root);
	}
	void postOrder()
	{
		postOrder(root);
	}

private:
	void preOrder(Node<K, V>*node) const
	{
		if (node != NULL)
		{
			cout << node->key << "," << node->value << ";";
			preOrder(node->left);
			preOrder(node->right);
		}
	}
	void inOrder(Node<K, V>*node) const
	{
		if (node != NULL)
		{
			inOrder(node->left);
			cout << node->key << "," << node->value << ";";
			inOrder(node->right);
		}
	}
	void postOrder(Node<K, V>*node) const
	{
		if (node != NULL)
		{
			postOrder(node->left);
			postOrder(node->right);
			cout << node->key << "," << node->value << ";";
		}
	}
	Node<K, V>* Remove(Node<K, V>* node, K key) {
		if (node == NULL) {
			return NULL;
		}
		Node<K, V>* ret;
		if (key < node->key) {
			node->left = Remove(node->left, key);
			ret = node;
		}
		else if (key > node->key) {
			node->right = Remove(node->right, key);
			ret = node;
		}
		else {
			if (node->left == NULL) {
				Node<K, V>* rn = node->right;
				node->right = NULL;
				size--;
				ret = rn;
			}
			else if (node->right == NULL) {
				Node<K, V>* ln = node->left;
				node->left = NULL;
				size--;
				ret = ln;
			}
			else
			{
				Node<K, V>* newroot = minimum(node->right);
				newroot->right = Remove(node->right, newroot->key);
				newroot->left = node->left;
				node->left = node->right = NULL;
				ret = newroot;
			}
		}
		if (ret == NULL) {
			return NULL;
		}
		ret->height = 1 + max(GetHeight(ret->left), GetHeight(ret->right));
		int balancefactor = GetBalanceFactor(ret);

		//左边较大,LL右旋转
		if (balancefactor > 1 && GetBalanceFactor(ret->left) >= 0) {
			return RightRotate(ret);
		}
		//左边较大,RR右旋转
		if (balancefactor < -1 && GetBalanceFactor(ret->right) <= 0) {
			return LeftRotate(ret);
		}
		//右边较大,LR左旋转,右旋转
		if (balancefactor > 1 && GetBalanceFactor(ret->left) < 0) {
			ret->left = LeftRotate(ret->left);
			return RightRotate(ret);
		}
		//右边较大,RL右旋转,左旋转
		if (balancefactor < -1 && GetBalanceFactor(ret->right) > 0) {
			ret->right = RightRotate(ret->right);
			return LeftRotate(ret);
		}
		if (abs(balancefactor) > 1) {
			cout << balancefactor << endl;
		}
		return ret;
	}


	//node为根
	Node<K, V>* add(Node<K, V>* node, K e, V value) {
		if (node == NULL) {
			size++;
			return new Node<K, V>(e, value);
		}
		else if (e < node->key) {
			node->left = add(node->left, e, value);
		}
		else if (e > node->key) {
			node->right = add(node->right, e, value);
		}
		else {
			node->value = value;
		}
		node->height = 1 + max(GetHeight(node->left), GetHeight(node->right));
		int balancefactor = GetBalanceFactor(node);

		//左边较大,LL右旋转
		if (balancefactor > 1 && GetBalanceFactor(node->left) >= 0) {
			return RightRotate(node);
		}
		//左边较大,RR右旋转
		if (balancefactor < -1 && GetBalanceFactor(node->right) <= 0) {
			return LeftRotate(node);
		}
		//右边较大,LR左旋转,右旋转
		if (balancefactor > 1 && GetBalanceFactor(node->left) < 0) {
			node->left = LeftRotate(node->left);
			return RightRotate(node);
		}
		//右边较大,RL右旋转,左旋转
		if (balancefactor < -1 && GetBalanceFactor(node->right) > 0) {
			node->right = RightRotate(node->right);
			return LeftRotate(node);
		}
		int balancefactor = GetBalanceFactor(node);
		if (abs(balancefactor) > 1) {
			cout << balancefactor << endl;
		}
		return node;
	}
	Node<K, V>* RightRotate(Node<K, V>* y) {
		Node<K, V>* x = y->left;
		//右旋转
		y->left = x->right;
		x->right = y;
		//更新高度
		y->height = 1 + max(GetHeight(y->left), GetHeight(y->right));
		x->height = 1 + max(GetHeight(x->left), y->height);
		return x;
	}
	Node<K, V>* LeftRotate(Node<K, V>* y) {
		Node<K, V>* x = y->right;
		//左旋转
		y->right = x->left;
		x->left = y;

		//更新高度
		y->height = 1 + max(GetHeight(y->left), GetHeight(y->right));
		x->height = 1 + max(y->height, GetHeight(x->right));
		return x;
	}

private:
	Node<K, V>* root;
	int size;
};




int main(void)
{
	ifstream infile("D:\\Desktop\\Clianxi\\C++\\trie\\testfile\\1.Harry Potter and the Sorcerer's Stone.txt");
	if (!infile.is_open()) {
		return -1;
	}
	vector<string> words;
	RBT<string, int> rbt;
	AVLT<string, int> avlt;
	while (!infile.eof())
	{
		string line, tmp;
		while (infile >> tmp) {
			tmp.erase(0, tmp.find_first_not_of(" "));
			words.push_back(tmp);
			if (avlt.Contains(tmp)) {
				avlt.set(tmp, avlt.Get(tmp) + 1);
			}
			else
				avlt.add(tmp, 1);
			if (rbt.Contains(tmp)) {
				rbt.set(tmp, rbt.Get(tmp) + 1);
			}
			else
				rbt.add(tmp, 1);

		}
	}
	infile.close();
	cout << "不同单词" << avlt.Size() << endl;
	cout << "___________" << endl;
	cout << "不同单词" << rbt.Size() << endl;
	cout << "___________" << endl;
	cout << "isBST  " << avlt.IsBST() << endl;
	cout << "isBST  " << rbt.IsBST() << endl;
	cout << "isBanlanced  " << avlt.IsBalanced() << endl;
	cout << "isBanlanced  " << rbt.IsBalanced() << endl;
	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值