从二叉搜索树中的end()迭代器减少迭代器

时间:2017-12-26 18:16:54

标签: c++ pointers iterator binary-search-tree

在二叉搜索树中,end()成员函数只返回iterator(nullptr),对吧?但节点nullptr不包含有关其leftrightparent数据的信息。那么我们如何从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;
    }

2 个答案:

答案 0 :(得分:1)

而不是end()作为迭代器(nullptr)使其成为迭代器(&amp; anchor),其中anchor是包含树的成员,用于保存根开始和最终节点指针。然后减少你只需返回上一个节点(相反的动作来增加)。

它确实需要比简单地保存根节点指针更多的工作,但它也允许begin()和end()为O(1)操作。

答案 1 :(得分:1)

如果希望迭代器是双向迭代器,则需要提供必要的信息以查找end()返回的迭代器中树的最后一个节点。为了避免处理特殊情况只是为了递减end()迭代器,你可以使用一个“秘密”节点,它使用它的左指针指向树的根。这样end()迭代器就只是指向这个秘密节点的指针:使用这种方法,不需要在递增,递减或比较中进行任何特殊处理。

由于通常不希望在根中存储节点值,因此通常的实现将节点拆分为NodeBase,仅保存导航所需的指针和NodeValueNodeBase派生的并添加节点的值。根使用NodeBase成员,迭代器类型为NodeBase*:导航只需要指针。由于只允许有效迭代器被解除引用,因此在访问节点值时可以使用static_cast<NodeValue*>(n)来获取NodeValue