在二叉搜索树中,end()
成员函数只返回iterator(nullptr)
,对吧?但节点nullptr
不包含有关其left
,right
和parent
数据的信息。那么我们如何从end()
递减迭代器呢?以下是我到目前为止(在iterator<T>
类中定义)。我的iterator<T>
班级有node<T>* ptr
个唯一的数据成员,我的node<T>
班级有T value; node *left, *right, *parent;
成员。
iterator& operator--() {
// if (!ptr) what to do???
if (ptr->left)
ptr = node<T>::max_node(ptr->left);
else {
node<T>* previous = ptr;
ptr = ptr->parent;
while (ptr && ptr->left == previous) {
previous = ptr;
ptr = ptr->parent;
}
}
return *this;
}
答案 0 :(得分:1)
而不是end()作为迭代器(nullptr)使其成为迭代器(&amp; anchor),其中anchor是包含树的成员,用于保存根开始和最终节点指针。然后减少你只需返回上一个节点(相反的动作来增加)。
它确实需要比简单地保存根节点指针更多的工作,但它也允许begin()和end()为O(1)操作。
答案 1 :(得分:1)
如果希望迭代器是双向迭代器,则需要提供必要的信息以查找end()
返回的迭代器中树的最后一个节点。为了避免处理特殊情况只是为了递减end()
迭代器,你可以使用一个“秘密”节点,它使用它的左指针指向树的根。这样end()
迭代器就只是指向这个秘密节点的指针:使用这种方法,不需要在递增,递减或比较中进行任何特殊处理。
由于通常不希望在根中存储节点值,因此通常的实现将节点拆分为NodeBase
,仅保存导航所需的指针和NodeValue
从NodeBase
派生的并添加节点的值。根使用NodeBase
成员,迭代器类型为NodeBase*
:导航只需要指针。由于只允许有效迭代器被解除引用,因此在访问节点值时可以使用static_cast<NodeValue*>(n)
来获取NodeValue
。