红黑树简单介绍
红黑树是带有颜色属性的自平衡二叉查找树。对红黑树的操作在最坏情形下花费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;
}