红黑树的迭代器
增加迭代器分为三步:
-
定义一个类,封装一个指针
1、构造
2、就有指针的类似行为:operator*()、operator->()
3、能够移动:前置++、后置++、前置–、后置–
4、能够比较 :!=、== -
在容器类中给迭代器类型取别名
-
在容器中增加begin()、end()
#include<iostream>
using namespace std;
enum Color { RED, BLACK };
template<class T>
struct RBTreeNode
{
RBTreeNode(const T& data = T(), Color color = RED)
:_pLeft(nullptr)
, _pRight(nullptr)
, _pParent(nullptr)
, _data(data)
, _color(color)
{}
RBTreeNode<T>* _pLeft;
RBTreeNode<T>* _pRight;
RBTreeNode<T>* _pParent;
T _data;
Color _color;
};
template<class T>
struct RBTreeIterator
{
typedef RBTreeNode<T> Node;
typedef RBTreeIterator<T> Self;
RBTreeIterator(Node* pNode)
:_pNode(pNode)
{}
T& operator*()
{
return _pNode->_data;
}
T* operator->()
{
return &(operator*());
}
Self& operator++()
{
Increament();
return *this;
}
Self operator++(int)
{
Self temp(*this);
Increament();
return temp;
}
Self& operator--()
{
DeIncreament();
return *this;
}
Self operator--(int)
{
Self temp(*this);
DeIncreament();
return temp;
}
bool operator!=(const Self& s)const
{
return _pNode != s._pNode;
}
bool operator==(const Self& s)const
{
return _pNode == s._pNode;
}
private:
void Increament()
{
if (_pNode->_pRight)
{
_pNode = _pNode->_pRight;
while (_pNode->_pLeft)
_pNode = _pNode->_pLeft;
}
else
{
Node* pParent = _pNode->_pParent;
while (_pNode == pParent->_pRight)
{
_pNode = pParent;
pParent = _pNode->_pParent;
}
if (_pNode->_pRight != pParent)
_pNode = pParent;
}
}
// --
void DeIncreament()
{
// 处理迭代器在end的位置
if (_pNode->_pParent->_pParent == _pNode && _pNode->_color == RED)
_pNode = _pNode->_pRight;
else if (_pNode->_pLeft)
{
_pNode = _pNode->_pLeft;
while (_pNode->_pRight)
_pNode = _pNode->_pRight;
}
else
{
Node* pParent = _pNode->_pParent;
while (pParent->_pLeft == _pNode)
{
_pNode = pParent;
pParent = _pNode->_pParent;
}
_pNode = pParent;
}
}
Node* _pNode;
};
//T:可能是键值对<key,value>
// 可能是一个key
//不论节点中存储的是<key,value>||key,都是按照key来进行比较的
//KeyOfValue:提取data中的key
template<class T, class KeyOfValue>
class RBTree
{
typedef RBTreeNode<T> Node;
public:
typedef RBTreeIterator<T> iterator;
RBTree()
:_size(0)
{
_pHead = new Node;
_pHead->_pLeft = _pHead;
_pHead->_pRight = _pHead;
}
pair<iterator, bool> Insert(const T& data)
{
//按照二叉搜索树得性质插入新节点
Node*& pRoot = GetRoot();
Node* pNewNode = nullptr;
if (nullptr == pRoot)
{
pNewNode = pRoot = new Node(data, BLACK);
pRoot->_pParent = _pHead;
}
else
{
//找待插入节点在二叉树中的位置
//保存其双亲节点
Node* cur = pRoot;
Node* pParent = nullptr;
while (cur)
{
pParent = cur;
if (KeyOfValue()(data) < KeyOfValue()(cur->_data))
cur = cur->_pLeft;
else if (KeyOfValue()(data) > KeyOfValue()(cur->_data))
cur = cur->_pRight;
else
return make_pair(iterator(cur), false);
}
//插入新节点
pNewNode = cur = new Node(data);
if ((KeyOfValue()(data) < KeyOfValue()(pParent->_data)))
pParent->_pLeft = cur;
else
pParent->_pRight = cur;
cur->_pParent = pParent;
while (pParent != _pHead && pParent->_color == RED)
{
Node* grandFather = pParent->_pParent;
if (pParent == grandFather->_pLeft)
{
Node* uncle = grandFather->_pRight;
if (uncle&&uncle->_color == RED)
{
pParent->_color = BLACK;
uncle->_color = BLACK;
grandFather->_color = RED;
cur = grandFather;
pParent = cur->_pParent;
}
else
{
if (cur == pParent->_pRight)
{
RotateL(pParent);
swap(cur, pParent);
}
pParent->_color = BLACK;
grandFather->_color = RED;
RotateR(grandFather);
}
}
else
{
Node* uncle = grandFather->_pLeft;
if (uncle&&uncle->_color == RED)
{
pParent->_color = BLACK;
uncle->_color = BLACK;
grandFather->_color = RED;
cur = grandFather;
pParent = cur->_pParent;
}
else
{
if (cur == pParent->_pLeft)
{
RotateR(pParent);
swap(cur, pParent);
}
grandFather->_color = RED;
pParent->_color = BLACK;
RotateL(grandFather);
}
}
}
}
++_size;
pRoot->_color = BLACK;
_pHead->_pLeft = LeftMost();
_pHead->_pRight = RightMost();
return make_pair(iterator(pNewNode), true);
}
iterator Begin()
{
return iterator(LeftMost());
}
iterator End()
{
return iterator(_pHead);
}
bool Empty()const
{
return _pHead->_pLeft == _pHead;
}
size_t Size()const
{
return _size;
}
void Clear()
{
_Destroy(GetRoot());
}
iterator Find(const T& data)
{
Node* pCur = GetRoot();
while (pCur)
{
if ((KeyOfValue()(data) == KeyOfValue()(pCur->_data)))
return iterator(pCur);
else if ((KeyOfValue()(data) < KeyOfValue()(pCur->_data)))
pCur = pCur->_pLeft;
else
pCur = pCur->_pRight;
}
return End();
}
Node*& GetRoot()
{
return _pHead->_pParent;
}
void InOrder()
{
_InOrder(GetRoot());
}
Node* LeftMost()
{
Node* root = GetRoot();
if (nullptr == root)
return _pHead;
Node* cur = root;
while (cur->_pLeft)
cur = cur->_pLeft;
return cur;
}
Node* RightMost()
{
Node* pRoot = GetRoot();
if (nullptr == pRoot)
return _pHead;
Node* cur = pRoot;
while (cur->_pRight)
cur = cur->_pRight;
return cur;
}
bool IsValidRBTRee()
{
Node* pRoot = GetRoot();
if (nullptr == pRoot)
return true;
if (pRoot->_color != BLACK)
{
cout << "违反性质一:根节点是黑色" << endl;
return false;
}
size_t blackCount = 0;
Node* cur = pRoot;
while (cur)
{
if (cur->_color == BLACK)
blackCount++;
cur = cur->_pLeft;
}
size_t pathBalck = 0;
return _IsValidRBTRee(pRoot, blackCount, pathBalck);
}
private:
void _Destroy(Node*& pRoot)
{
if (pRoot)
{
_Destroy(pRoot->_pLeft);
_Destroy(pRoot->_pRight);
delete pRoot;
pRoot = nullptr;
}
}
bool _IsValidRBTRee(Node* pRoot, size_t blackCount, size_t pathBlack)
{
if (nullptr == pRoot)
return true;
if (pRoot->_color == BLACK)
pathBlack++;
Node* pParent = pRoot->_pParent;
if (pParent != _pHead &&
RED == pParent->_color && RED == pRoot->_color)
{
cout << "违反性质3:不能存在连在一起的红色节点" << endl;
return false;
}
// 叶子节点
if (nullptr == pRoot->_pLeft && nullptr == pRoot->_pRight)
{
if (pathBlack != blackCount)
{
cout << "违反性质4:每条路径中黑色节点个数均相同" << endl;
return false;
}
}
return _IsValidRBTRee(pRoot->_pLeft, blackCount, pathBlack) &&
_IsValidRBTRee(pRoot->_pRight, blackCount, pathBlack);
}
void _InOrder(Node* pRoot)
{
if (pRoot)
{
_InOrder(pRoot->_pLeft);
cout << pRoot->_data << " ";
_InOrder(pRoot->_pRight);
}
}
void RotateL(Node* pParent)
{
Node* pSubR = pParent->_pRight;
Node* pSubRL = pSubR->_pLeft;
pParent->_pRight = pSubRL;
if (pSubRL)
pSubRL->_pParent = pParent;
pSubR->_pLeft = pParent;
Node* ppParent = pParent->_pParent;
pParent->_pParent = pSubR;
pSubR->_pParent = ppParent;
if (ppParent == _pHead)
_pHead->_pParent = pSubR;
else
{
if (pParent == ppParent->_pLeft)
ppParent->_pLeft = pSubR;
else
ppParent->_pRight = pSubR;
}
}
void RotateR(Node* pParent)
{
Node* pSubL = pParent->_pLeft;
Node* pSubLR = pSubL->_pRight;
pParent->_pLeft = pSubLR;
if (pSubLR)
pSubLR->_pParent = pParent;
pSubL->_pRight = pParent;
Node* pPParent = pParent->_pParent;
pParent->_pParent = pSubL;
pSubL->_pParent = pPParent;
if (pPParent == _pHead)
_pHead->_pParent = pSubL;
else
{
if (pParent == pPParent->_pLeft)
pPParent->_pLeft = pSubL;
else
pPParent->_pRight = pSubL;
}
}
private:
Node* _pHead;
size_t _size;
};
map的模拟实现
map的底层结构就是红黑树,因此在map中直接封装一颗红黑树,然后将其接口包装即可
namespace bite
{
template<class K,class V>
class map
{
typedef pair<K, V> ValueType;
struct KeyOfValue
{
const K& operator()(const ValueType& data)
{
return data.first;
}
};
typedef RBTree<ValueType, KeyOfValue> RBTree;
typedef typename RBTree::iterator iterator;
public:
map()
:t()
{}
//iterator
iterator begin()
{
return t.Begin();
}
iterator end()
{
return t.End();
}
//capacity
bool empty()const
{
return t.Empty();
}
size_t size()const
{
return t.Size();
}
//access
V& operator[](const K& key)
{
return (*(t.Insert(pair<K, V>(key, V())).first)).second;
}
///
//modify
pair<iterator, bool> insert(const ValueType& data)
{
return t.Insert(data);
}
void clear()
{
return t.Clear();
}
iterator find(const K& key)
{
return t.Find(pair<K, V>(key, V()));
}
private:
RBTree t;
};
}
set的模拟实现
set的底层结构为红黑树,因此只需在set内部封装一颗红黑树,即可将容器实现出来。
namespace bite
{
template<class K>
class set
{
typedef K ValueType;
struct KeyOfValue
{
const K& operator()(const ValueType& data)
{
return data;
}
};
typedef RBTree<ValueType, KeyOfValue> RBTree;
typename typedef RBTree::iterator iterator;
public:
set()
:t()
{}
//
//iterator
iterator begin()
{
return t.Begin();
}
iterator end()
{
return t.End();
}
//capacity
bool empty()const
{
return t.Empty();
}
size_t size()const
{
return t.Size();
}
//
//modify
pair<iterator, bool> insert(const ValueType& data)
{
return t.Insert(data);
}
void clear()
{
t.Clear();
}
iterator find(const K& key)
{
return t.Find(key);
}
private:
RBTree t;
};
}