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;
};
红黑树的实现
最新推荐文章于 2024-10-06 20:10:02 发布
该文章定义了一个名为RBTreeIterator的模板类,用于遍历红黑树结构。迭代器提供了自增和自减操作,以及访问当前节点数据的方法。在自增和自减过程中,内部实现了寻找右子树最左侧节点和左子树最右侧节点的逻辑,以支持迭代器的前后移动。
摘要由CSDN通过智能技术生成