从二叉搜索树中的end()迭代器减少迭代器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从二叉搜索树中的end()迭代器减少迭代器相关的知识,希望对你有一定的参考价值。
在二叉搜索树中,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()
迭代器,你可以使用一个“秘密”节点,它使用它的左指针指向树的根。这样,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() 将返回二叉搜索树中的下一个最小的数。