1. map与set封装红黑树的方式
1.1 大概实现思路
STL库中,实现的map与set其底层都为红黑树这种数据结构,在前面的学习中,我们已经简单模拟实现了红黑树。 因此,对于map与set的实现无需再去从零开始一一构建,而是可以采用类似于栈与队列这两个容器适配器的形式,直接将红黑树进行封装,调用其的各种方法接口间接实现。
1.2 红黑树模板抽象
虽然map与set的底层数据结构都为红黑树,但是,它们也并不是完全相同,map中存储的数据结点为KV类型,而set中存储的数据结点为K类型,所以,两者在接口与使用上也有所不同。 可仅仅因此不大的差别就再写一份高度类同的红黑树代码,就不免冗余性过高,由此,我们仿照库中实现的类似方式,将红黑树抽象为模板,通过模板参数来调整细节的方式,来同时适配map与set的需求。
template < class K , class T , class KeyOfT >
1.3 红黑树的迭代器
当调用库中的map与set容器时,我们使用相应迭代器遍历其中存储数据,得到的是一串排序好的有序数据。 因为map与set的底层本质上为一棵搜索二叉树,这种遍历后得到的数据特点,我们不难知道,迭代器底层实则是在由整颗树最左侧结点做中序遍历,那么,其底层的逻辑究竟应该怎么去实现呢?
2. 红黑树模板的实现
2.1 结点结构的定义
enum colour
{
Red,
Black
} ;
template < class K , class T >
struct RBTreeNode
{
RBTreeNode< K, T> * _left;
RBTreeNode< K, T> * _right;
RBTreeNode< K, T> * _parent;
T _kv;
colour _col;
RBTreeNode ( const T& kv)
: _left ( nullptr )
, _right ( nullptr )
, _parent ( nullptr )
, _kv ( kv)
, _col ( Red)
{ }
} ;
2.2 红黑树迭代器的实现
2.2.1 迭代器的结构
template < class K , class T , class Ref , class Ptr >
class RBTree_iterator
{
typedef RBTreeNode< K, T> RBTNode;
public :
RBTree_iterator ( RBTNode* node)
: _node ( node)
{ }
RBTree_iterator ( const RBTree_iterator& it)
{
_node = it. _node;
}
RBTree_iterator operator ++ ( int ) ;
RBTree_iterator operator -- ( int ) ;
Ref operator * ( ) ;
Ptr operator -> ( ) ;
bool operator == ( RBTree_iterator it) ;
bool operator != ( RBTree_iterator it) ;
private :
RBTNode* _node;
} ;
2.2.2 迭代器的方法实现
杂项
Ref operator * ( )
{
return _node-> _kv;
}
Ptr operator -> ( )
{
return & _node-> _kv;
}
bool operator == ( RBTree_iterator it)
{
return _node == it. _node;
}
bool operator != ( RBTree_iterator it)
{
return _node != it. _node;
}
后置++与–
RBTree_iterator operator ++ ( int )
{
RBTree_iterator cp ( * this ) ;
if ( _node-> _right)
{
RBTNode* SubLeft = _node-> _right;
while ( SubLeft-> _left)
{
SubLeft = SubLeft-> _left;
}
_node = SubLeft;
}
else
{
RBTNode* cur = _node;
RBTNode* parent = cur-> _parent;
if ( cur == parent-> _left)
{
_node = parent;
}
else
{
while ( parent && cur == parent-> _right)
{
cur = parent;
parent = cur-> _parent;
}
_node = parent;
}
}
return cp;
}
RBTreeNode_iterator operator -- ( int )
{
RBTree_iterator cp ( * this ) ;
if ( _node-> _left)
{
RBTNode* SubRight = _node-> _left;
while ( SubRight-> _right)
{
SubRight = SubRight-> _right;
}
_node = SubRight;
}
else
{
RBTNode* cur = _node;
RBTNode* parent = _node-> _parent;
while ( parent && cur == parent-> _left)
{
cur = parent;
parent = cur-> _parent;
}
_node = parent;
}
return cp;
}
2.3 树结构的定义
template < class K , class T , class KeyOfT >
class RBTree
{
typedef RBTreeNode< K, T> RBTNode;
public :
bool Find ( const K& key) ;
pair< iterator, bool > Insert ( const T& kv) ;
private :
RBTNode* _root = nullptr ;
KeyOfT con;
}
2.4 红黑树接口实现
2.4.1 插入
pair< iterator, bool > Insert ( const T& kv)
{
RBTNode* cur = _root;
RBTNode* parent = nullptr ;
while ( cur)
{
if ( con ( kv) < con ( cur-> _kv) )
{
parent = cur;
cur = cur-> _left;
}
else if ( con ( kv) > con ( cur-> _kv) )
{
parent = cur;
cur = cur-> _right;
}
else
{
return make_pair ( iterator ( cur) , false ) ;
}
}
RBTNode* newnode = new RBTNode ( kv) ;
cur = newnode;
if ( _root == nullptr )
{
_root = cur;
_root-> _col = Black;
return make_pair ( iterator ( cur) , true ) ;
}
else
{
if ( con ( kv) < con ( parent-> _kv) )
{
parent-> _left = cur;
cur-> _parent = parent;
}
else
{
parent-> _right = cur;
cur-> _parent = parent;
}
}
while ( parent)
{
if ( parent-> _col == Black)
{
break ;
}
else
{
RBTNode* grandparent = parent-> _parent;
RBTNode* uncle = grandparent-> _left;
if ( parent == grandparent-> _left)
{
uncle = grandparent-> _right;
}
if ( uncle && uncle-> _col == Red)
{
parent-> _col = uncle-> _col = Black;
grandparent-> _col = Red;
cur = grandparent;
parent = cur-> _parent;
}
else
{
if ( parent == grandparent-> _left)
{
if ( cur == parent-> _left)
{
RotateR ( grandparent) ;
parent-> _col = Black;
grandparent-> _col = Red;
}
else
{
RotateLR ( grandparent) ;
cur-> _col = Black;
grandparent-> _col = Red;
}
}
else
{
if ( cur == parent-> _right)
{
RotateL ( grandparent) ;
parent-> _col = Black;
grandparent-> _col = Red;
}
else
{
RotateRL ( grandparent) ;
cur-> _col = Black;
grandparent-> _col = Red;
}
}
break ;
}
}
}
_root-> _col = Black;
return make_pair ( iterator ( newnode) , true ) ;
}
2.4.2 查找
bool Find ( K key)
{
RBTNode* cur = _root;
while ( cur)
{
if ( key < con ( cur-> _kv) )
{
cur = cur-> _left;
}
else if ( key > con ( cur-> _kv) )
{
cur = cur-> _right;
}
else
{
return true ;
}
}
return false ;
}
2.4.3 迭代器相关
typedef RBTree_iterator< K, T, T& , T* > iterator;
typedef RBTree_iterator< K, T, const T& , const T* > const_iterator;
iterator begin ( )
{
RBTNode* cur = _root;
while ( cur-> _left)
{
cur = cur-> _left;
}
return cur;
}
iterator end ( )
{
return nullptr ;
}
const iterator cbegin ( ) const
{
RBTNode* cur = _root;
while ( cur-> _left)
{
cur = cur-> _left;
}
return cur;
}
const iterator cend ( ) const
{
return nullptr ;
}
3. map与set的自实现
3.1 set封装
template < class K >
class myset
{
struct KeyOfT
{
K operator ( ) ( const K& key)
{
return key;
}
} ;
typedef RBTree_iterator< K, K, K& , K* > iterator;
typedef RBTree_iterator< K, K, const K& , const K* > const_iterator;
public :
bool Find ( K key)
{
return tree. Find ( key) ;
}
pair< iterator, bool > Insert ( K key)
{
return tree. Insert ( key) ;
}
iterator begin ( )
{
return tree. begin ( ) ;
}
iterator end ( )
{
return tree. end ( ) ;
}
const_iterator cbegin ( ) const
{
return tree. cbegin ( ) ;
}
const_iterator cend ( ) const
{
return tree. cend ( ) ;
}
void InOrder ( )
{
tree. InOrder ( ) ;
}
private :
RBTree< K, K, KeyOfT> tree;
} ;
3.2 map封装
template < class K , class V >
class mymap
{
struct KeyOfT
{
K operator ( ) ( const pair< const K, V> kv)
{
return kv. first;
}
} ;
typedef RBTree_iterator< K, pair< const K, V> , pair< const K, V> & , pair< const K, V> * > iterator;
typedef RBTree_iterator< K, pair< const K, V> , const pair< const K, V> & , const pair< const K, V> * > const_iterator;
public :
bool Find ( K key)
{
return tree. Find ( key) ;
}
pair< iterator, bool > Insert ( const pair< K, V> kv)
{
return tree. Insert ( kv) ;
}
iterator begin ( )
{
return tree. begin ( ) ;
}
iterator end ( )
{
return tree. end ( ) ;
}
const_iterator cbegin ( ) const
{
return tree. cbegin ( ) ;
}
const_iterator cend ( ) const
{
return tree. cend ( ) ;
}
V& operator [ ] ( const K key)
{
pair< iterator, bool > ret = Insert ( make_pair ( key, V ( ) ) ) ;
return ret. first-> second;
}
private :
RBTree< K, pair< const K, V> , KeyOfT> tree;
} ;