c++ - 从二叉搜索树中的 end() 迭代器递减迭代器

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

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

最佳答案

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

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

关于c++ - 从二叉搜索树中的 end() 迭代器递减迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47982227/

相关文章:

安卓 NDK : How to replace AAsset to work with files from external Storage for FFmpeg decoding

将 void* 转换为 double

.net - 压缩对象指针的目的是什么?

c++ - 有什么方法可以结合 std::istream_iterator 和 std::for_each_n() 吗?

c++ - 在模板类中使用 vector 迭代器

c++ - 异常对象的静态类型

c++ - 读取空间分隔的数据并将其插入适当的容器

c++ - 初始化堆分配对象时出错

C++,将n个参数的函数作为参数传递

c++ - 用 "pure"C++11 替代方案替换 BGL 遍历顶点?