Rb树简介

红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单 路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。(性质3、性质4保证了红黑树最长的路径不超过最短路径的两倍)

如图所示:

红黑树是满足下面红黑性质的二叉搜索树

1. 每个节点,不是红色就是黑色的

2. 根节点是黑色的

3. 如果一个节点是红色的,则它的两个子节点是黑色的

4. 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

好,现在了解了红黑树的特性之后,我们来开始创建红黑树。

//红黑树的节点的结构
 template<class K,class V>
struct RedBlaceTreeNode
{
typedef RedBlaceTreeNode<K, V> Node;
RedBlaceTreeNode(const K& key,const V& value)
:_left(NULL), _right(NULL), _parent(NULL)
, _key(key), _value(value), _col(RED)
{} Node* _left;
Node* _right;
Node* _parent;
K _key;
V _value;
Sign _col;
};

//红黑树的结构

template<class K,class V>
class RedBlaceTree
{
typedef RedBlaceTreeNode<K, V> Node;
public:
RedBlaceTree()
:_root(NULL)
{}
public:
bool _Push(const K& key, const V& value);
void _LeftSpin(Node*& parent);
void _RightSpin(Node*& parent);
void _LeftRightSpin(Node*& parent);
void _RightLeftSpin(Node*& parent); /*Check*/
//1. 每个节点,不是红色就是黑色的
//2. 根节点是黑色的
//3. 如果一个节点是红色的,则它的两个子节点是黑色的
//4. 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
void _Inorder(){ Inorder(_root); }
void Inorder(Node* root);
protected:
Node* _root;
};

//创建红黑树的函数 _Push()

插入的几种情况

cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点

1.第一种情况 cur为红,p为红,g为黑,u存在且为红 则将p,u改为黑,g改为红,然后把g当成cur,继续向上调整。( 还挺简单  O(∩_∩)O   继续往下看↓↓)

2.第二种情况 cur为红,p为红,g为黑,u不存在/u为黑 p为g的左孩子,cur为p的左孩子,则进行右单旋转;相反,p为g的右孩子,cur为p的右孩子,则进行左单旋转 p、g变色--p变黑,g变红

3.第三种情况 cur为红,p为红,g为黑,u不存在/u为黑
p为g的左孩子,cur为p的右孩子,则针对p做左单旋转;相反,p为g的右孩子,cur为p的左孩子,则针对p做右单旋转 则转换成了情况2

template<class K, class V>
bool RedBlaceTree<K, V>::_Push(const K& key, const V& value)
{
Node* cur = _root;
Node* parent = NULL;
if (_root == NULL)
{
_root = new Node(key, value);
_root->_col = BLACK;
}
else
{
while (cur)
{
parent = cur;
if (key > cur->_key)
{
cur = cur->_right;
}
else if (key < cur->_key)
{
cur = cur->_left;
}
else
{
return false;
}
}
cur = new Node(key, value);
if (key > parent->_key)
{
parent->_right = cur;
cur->_parent = parent;
}
else
{
parent->_left = cur;
cur->_parent = parent;
} if (parent->_col == RED) //如果父亲节点为红色就需要调整
{
bool sign = false; //标记位,用来标记grandparent是否为根节点
while (cur->_parent)
{
Node* grandparent = NULL;
Node* uncle = NULL;
parent = cur->_parent;
grandparent = parent->_parent; if (grandparent) //如果祖父节点存在
{
if (grandparent == _root)
{
sign = true; //标记祖父节点是否为根节点
} if (parent->_key > grandparent->_key) //确定叔父节点
{
uncle = grandparent->_left;
}
else
{
uncle = grandparent->_right;
} //第一种情况:cur为红,p为红,g为黑,u存在且为红
if (uncle && uncle->_col == RED)
{
parent->_col = BLACK;
uncle->_col = BLACK;
grandparent->_col = RED;
if (sign)
{
break;
}
cur = grandparent;
} //第二种情况:cur为红,p为红,g为黑,u不存在/u为黑(单旋)
//第三种情况:cur为红,p为红,g为黑,u不存在/u为黑(双旋)
else
{
//第二
if (grandparent->_left == parent && parent->_left == cur)
{
grandparent->_col = RED;
parent->_col = BLACK;
_RightSpin(grandparent);
if (sign)
{
_root = grandparent;
}
break;
}
else if (grandparent->_right == parent && parent->_right == cur)
{
grandparent->_col = RED;
parent->_col = BLACK;
_LeftSpin(grandparent);
if (sign)
{
_root = grandparent;
}
break;
}
//第三
else if (grandparent->_left == parent && parent->_right == cur)
{
grandparent->_col = RED;
cur->_col = BLACK;
_LeftRightSpin(grandparent);
if (sign)
{
_root = grandparent;
}
break;
}
else if (grandparent->_right == parent && parent->_left == cur)
{
grandparent->_col = RED;
cur->_col = BLACK;
_RightLeftSpin(grandparent);
if (sign)
{
_root = grandparent;
}
break;
}
}
}
else //cur 的上面只有一层
{
break;
}
}
}
}
_root->_col = BLACK;
}

平衡搜索树(二) Rb 红黑树的更多相关文章

  1. 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...

  2. 谈c++ pb_ds库(二) 红黑树大法好

    厉害了,没想到翻翻pb_ds库看到这么多好东西,封装好的.现成的splay.红黑树.avl... 即使不能在考场上使用也可以用来对拍哦 声明/头文件 #include <ext/pb_ds/tr ...

  3. 红黑树(二)之 C语言的实现

    概要 红黑树在日常的使用中比较常用,例如Java的TreeMap和TreeSet,C++的STL,以及Linux内核中都有用到.之前写过一篇文章专门介绍红黑树的理论知识,本文将给出红黑数的C语言的实现 ...

  4. 大名鼎鼎的红黑树,你get了么?2-3树 绝对平衡 右旋转 左旋转 颜色反转

    前言 11.1新的一月加油!这个购物狂欢的季节,一看,已囊中羞涩!赶紧来恶补一下红黑树和2-3树吧!红黑树真的算是大名鼎鼎了吧?即使你不了解它,但一定听过吧?下面跟随我来揭开神秘的面纱吧! 一.2-3 ...

  5. 红黑树(R-B Tree)

    R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). ...

  6. 【红黑树】的详细实现(C++)

    红黑树的介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树.红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键 ...

  7. 红黑树(四)之 C++的实现

    概要 前面分别介绍红黑树的理论知识和红黑树的C语言实现.本章是红黑树的C++实现,若读者对红黑树的理论知识不熟悉,建立先学习红黑树的理论知识,再来学习本章. 目录1. 红黑树的介绍2. 红黑树的C++ ...

  8. 红黑树(五)之 Java的实现

    概要 前面分别介绍红黑树的理论知识.红黑树的C语言和C++的实现.本章介绍红黑树的Java实现,若读者对红黑树的理论知识不熟悉,建立先学习红黑树的理论知识,再来学习本章.还是那句老话,红黑树的C/C+ ...

  9. 第十四章 红黑树——C++代码实现

    红黑树的介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树.红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键 ...

随机推荐

  1. 转-----实现基本的Ajax和Json请求

    前面已经封装好了一个方法ajax(),通过这个方法可以实现Ajax请求,接下来就是给出 例程来测试这个方法和实现简单的功能.   视图的部分代码如下: 1 2 3 4 5 6 7 8 9 <bo ...

  2. PHP的哲学:Simple Is Hard

    原帖地址 PHP框架的繁荣是正确的发展方向吗?   作者 正文 poshboytl    发表时间:2009-01-19   最后修改:2009-04-06   做ROR有一年了, 感觉非常好.配合敏 ...

  3. bzoj 1026 [SCOI2009]windy数(数位DP)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4550  Solved: 2039[Submit][Sta ...

  4. 怎么把GPUImageFIlter处理过的图像保存成UIImage

    总共有两种方法能够把GPUImage处理过的图片转化成UIImage 方法一:     UIImage *inputImage = [UIImage imageNamed:@"Lambeau ...

  5. 关键字 final

    package com.zyw.reusableClass; import java.util.Random; /** * Created by zyw on 2016/3/26. * from th ...

  6. Error: rpmdb open failed

    yumrpmdb: Thread/process 17132/140266190264064 failed: Thread died in Berkeley DB l                  ...

  7. 两种常用的MySQL官方客户端软件

    本博文的主要内容有 .命令行客户端软件---MySQL Command Line Client .MySQL-Workbench客户端软件 1.命令行客户端软件---MySQL Command Lin ...

  8. system2之:4-LVM逻辑卷管理

    LVM有扩容功能,无容错功能 物理卷: [root@localhost ~]# pvscan   PV /dev/sda2   VG VolGroup   lvm2 [19.51 GiB / 0    ...

  9. Excel.Application SaveAs 把excel转换为html

    Excel.Application SaveAs 中的第二个参数的值: 可以直接用 10 进制的值代替左边的这些 xl 类型 . 例如:把excel转换为html的js: var oWB = oXL. ...

  10. 【LeetCode】Best Time to Buy and Sell Stock

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...