C++进阶——map&set的实现
红黑树的迭代器
迭代器的好处是可以方便遍历,是数据结构的底层实现与用户透明。如果想要给红黑树增加迭代器,需要考虑以前问题:
迭代器的定义
begin()与end()
STL明确规定,begin()与end()代表的是一段前闭后开的区间,而对红黑树进行中序遍历后,可以得到一个有序的序列,因此:begin()可以放在红黑树中最小节点(即最左侧节点)的位置end()放在最大节点(最右侧节点)的下一个位置,关键是最大节点的下一个位置在哪块?能否给成nullptr呢?答案是行不通的,因为对end()位置的迭代器进行–操作,必须要能找最后一个元素,此处就不行,因此最好的方式是将end()放在头结点的位置:
在这里我们不用设置一个循环迭代器,begin()直接就定义为最小的那棵树枝节点(最左节点),end()不是最右节点那棵树枝而是设置成空节点。
operator++()
只要cur右子树不会空就往右子树的最左子树走,但凡右子树为空就得往回走,朝着根走(中序就是左 、中、 右顺序走),当curparent->left,parent就是返回的节点,但是curparent->right,就接着往上走找父节点的父节点。
Self& operator++()//前置++
{
if (_node->_right)
{
// 1、右不为空,下一个就是右子树的最左节点
Node* subLeft = _node->_right;
while (subLeft->_left)
{
subLeft = subLeft->_left;
}
_node