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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从二叉搜索树中的end()迭代器减少迭代器相关的知识,希望对你有一定的参考价值。

在二叉搜索树中,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;
    }
答案

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

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

另一答案

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

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

以上是关于从二叉搜索树中的end()迭代器减少迭代器的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode练习(Python):栈类:第173题:二叉搜索树迭代器:实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。 调用 next() 将返回二叉搜索树中的下一个最小的数。

Leetcode练习(Python):栈类:第173题:二叉搜索树迭代器:实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。 调用 next() 将返回二叉搜索树中的下一个最小的数。

173. 二叉搜索树迭代器

leetcode_173二叉搜索树迭代器

LeetCode二叉树专题173. 二叉搜索树迭代器

173 Binary Search Tree Iterator 二叉搜索树迭代器