版权声明:, https://blog.csdn.net/u011760195/article/details/85254913
红黑树(1):B-树
前言
本文将带你了解红黑树插入和删除节点的处理过程,在这之前你应该对红黑树或BST有一些了解
R-B Tree简介
R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
特性
(1)根节点是黑色。
(2)每个外部节点(NULL)是黑色。
(3)如果一个节点是红色的,则它的子节点必须是黑色的。
(4)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
孪生兄弟 —— B-树
在学习之前我们来看另一种特殊的树 —— B-树
B-树(英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉查找树(binary search tree),可以拥有多于2个子节点。
经过提升变换可以将一颗红黑色变换为B-树
后面,我们将以B-树为辅助讲解红黑树的插入和删除操作
红黑树定义
根据以上信息我们给出红黑树的部分定义
红黑树定义
template <class _Elem > class _Tree{
protected:
class _Tree_Node;
typedef typename _Tree<_Elem>::_Tree_Node _Mytn;
typedef void(*_op_call_back)(_Mytn const *); // 定义回调函数
typedef _op_call_back _Mycb;
_Mytn *_root; // 根节点
size_t _size; // 树的大小
public:
class iterator;
typedef typename _Tree<_Elem>::iterator _Myit;
_Tree(void):_root(nullptr), _size(0u){}
~_Tree(void) {}
friend class _Tree<_Elem>::_Tree_Node;
};
节点定义
template <class _Elem > class _Tree<_Elem>::_Tree_Node{
protected:
enum COLOR :int {
red = 0,
black = 1
}color; // 颜色
_Elem value; // 值
_Mytn *lc; // 左孩子
_Mytn *rc; // 右孩子
_Mytn *parent; // 父节点
public:
explicit _Tree_Node(_Elem v = _Elem(), COLOR c = red, _Mytn *l = nullptr, _Mytn *r = nullptr, _Mytn *p = nullptr):value(v),color(c),lc(l),rc(r),parent(p){}
~_Tree_Node(){}
friend class _Tree<_Elem>::iterator;
friend class _Tree<_Elem>;
};
迭代器定义
template <class _Elem> class _Tree<_Elem>::iterator {
protected:
_Mytn *_p;
public:
explicit iterator(_Mytn *n = nullptr) :_p(n) {}
iterator(_Myit const& it) :_p(it._p) {}
friend class _Tree<_Elem>;
};