我正在为家庭作业实现一个 InOrder 迭代器,这意味着迭代器会这样前进:
- 拜访左孩子
- 访问节点
- 拜访右孩子
还有这些复杂性限制:遍历整个树的运行时复杂度应该是 o(n),其中 n 是树中的节点数,内存复杂度应该是 o(h),其中 h 是树的高度。
我尝试使用这种方法来实现 Advance(++) 运算符:
Tree<DataT>::_InOrderIterator::operator++()
{
TreeNode* node = this->Node->GetRightChild();
while(node != NULL)
{
advanceStack.Push(node);
node = node->GetLeftChild();
}
node = advanceStack.Pop();
if (node == NULL)
{
node = end; //reserved end node
}
this->Node = node;
return *this;
}
我还没有测试它,但我认为它应该可以正常工作。当我尝试实现后退 (--) 运算符时,我的问题就开始了。我最初的方法是拥有第二个堆栈:recedeStack,并以与 ++ 运算符相同的方式使用它。但我不知道如何使后退堆栈在 ++ 运算符中保持同步,反之亦然(--运算符中的 AdvanceStack)。无论如何,并非没有超越内存复杂性限制。
关于如何解决这个问题的任何想法(使用我当前的实现或不使用)?