一、什么事RBtree:
所谓的红黑树它需要满足一下条件:
1、该树是一颗二叉搜索树(搜索树就是按照节点值大小进行排序插入,中序就是所有节点的从小到大排序)
2、每个节点不是红色就是黑色
3、根节点为黑色
4、红节点不相连
5、任一节点至NULL(树尾)的任何途径,所含之黑节点树必须相同
为了统一,我们视NULL为黑节点。
红黑树的有点就在于它没有平衡因子,唯一需要让它调整的就是新节点的颜色,在数据插入上大大减少了调整次数。
我们来简单的看一组数据组成的个红黑树的模型:
{100,80,60,40,50,75,73,72,74}
新节点的颜色我们设为红色,我们把新的节
上图是模型红黑树调整的全过程,蓝色箭头代表的是平衡的红黑树有的是新节点的插入,红箭头代表对新插入节点导致不平衡的调整平衡过程。
二、RBTree是怎么实现的:
树的操作再前面刚开始学二叉树的时候相信你已经有所掌握,bst、avl、rbt树都一样,这三中树最重要的操作就是增加节点和删除节点,在这里我也只对节点的增加进行代码分析,在红黑树下篇会对其节点的删除代码进行分析,下面就是RBtree的增加节点代码展示:
#pragma once
template<class Type>
class RBTree;
typedef enum{RED = 0, BLACK = 1}COLOR;
template<class Type>
class RBNode
{
friend class RBTree<Type>;
public:
RBNode():data(Type()),leftchild(NULL),rightchild(NULL),color(0),parent(NULL)
{}
RBNode(Type d = Type(), RBNode<Type>* left = NULL, RBNode<Type>* right = NULL, RBNode<Type>* pr = NULL, COLOR c = RED):data(d), parent(pr),leftchild(left),rightchild(right),color(c)
{}
private:
COLOR color;
Type data;
RBNode<Type>* parent;
RBNode<Type>* leftchild;
RBNode<Type>* rightchild;
};
template<class Type>
class RBTree
{
public:
RBTree():root(NULL)
{}
public:
bool Insert(const Type & x)
{
return Insert(root, x);
}
protected:
bool Insert(RBNode<Type>* &t, const Type &x)
{
RBNode<Type>* p = t;
RBNode<Type> *pr = NULL;
while(p != NULL)
{
if(x == p->data)
return false;
pr = p;
if(x < p->data)
p=p->leftchild;
else
p = p->rightchild;
}
p = _Buynode(x);
if(pr == NULL)
{
p ->color = BLACK;
t = p;
return true;
}
if( x < pr->data)
pr->leftchild = p;
else
pr ->rightchild = p;
p->parent = pr;
_Balance_Tree(t,p);
return true;
}
protected:
//这里的调整方法比较复杂,代码最下面有优化代码,仔细阅读世界独有,走马观花竹篮打水
void _Balance_Tree(RBNode<Type>* &t, RBNode<Type>* q)
{
while(q->parent != NULL && q->parent->color == RED)//p->parent != NULL 是为了保证循环条件成立不会造成程序的崩溃,提高了程序的严谨性
{
RBNode<Type> * s