红黑树迭代器
实现map和set需要实现红黑树的迭代器,所以要实现迭代器
新实现一个类(_iterator),在红黑树中实现begin()等函数,把_iterator在红黑树中重命名
++重载:由于红黑树是用中序遍历也就是 先遍历左子树,在遍历根,最后遍历右子树,
也就是说红黑中的一个节点++后,
如果有右子树,就会跑到右子树最左节点
如果没有右子树,就要判断,根节点是父节点的左孩子还是右孩子,
如果是左孩子,就跑到父节点
如果是右孩子,则向上遍历,直到找到,或父节点为空(也就是到头)
迭代器
template<class K,class V>
class _iterator
{
public:
typedef RBNode<K, V> Node;
public:
Node* _node;
public:
_iterator(Node*node)
{
_node = node;
}
_iterator(const _iterator& it)
{
_node = it._node;
}
Node* LeftMost(Node* node)
{
if (node == nullptr)
return nullptr;
while (node->_left)
{
node = node->_left;
}
return node;
}
Node* RightMost(Node*root)
{
while (root->_right)
{
root = root->_right;
}
return root;
}
_iterator<K, V> operator++()
{
if (_node->_right != nullptr)
{
_node = LeftMost(_node->_right);
return *this;
}
Node* parent = _node->_parent;
if (_node->_parent == nullptr)
return _iterator<K, V>(nullptr);
while (parent)
{
if (parent->_left == _node)
{
_node = parent;
return *this;
}
else
{
_node = parent;
parent = parent->_parent;
}
}
_node = nullptr;
return _iterator<K,V>(nullptr);
}
K &operator*()
{
if (_node == nullptr)
printf("空指针");
return _node->_kv.first;
}
pair<K, V>operator->()
{
return _node->_kv;
}
bool operator!=(_iterator it)
{
return _node != it._node;
}
bool operator==(_iterator it)
{
return _node == it._node;
}
};
前置++
_iterator<K, V> operator++()
{
if (_node->_right != nullptr)
{
_node = LeftMost(_node->_right);
return *this;
}
Node* parent = _node->_parent;
if (_node->_parent == nullptr)
return _iterator<K, V>(nullptr);
while (parent)
{
if (parent->_left == _node)
{
_node = parent;
return *this;
}
else
{
_node = parent;
parent = parent->_parent;
}
}
_node = nullptr;
return _iterator<K,V>(nullptr);
}
解引用
K &operator*()
{
if (_node == nullptr)
printf("空指针");
return _node->_kv.first;
}
->
pair<K, V>operator->()
{
return _node->_kv;
}
!=
bool operator!=(_iterator it)
{
return _node != it._node;
}
==
bool operator==(_iterator it)
{
return _node == it._node;
}
把红黑树封装成set和map(要求只用一份红黑树代码)
Insert的返回类型为pair<iterator,bool>,返回iterator(迭代器)可以避免迭代器失效的情况,bool表示插入是否成功(返回1代表原数据没有,返回0代表存在)
在map和set类中,只需要调用红黑树中的函数即可
封装map和set就像是基类和子类的关系
子类在父类的基础上添加一些东西