【发布时间】:2011-08-17 04:13:31
【问题描述】:
我正在为家庭作业实现一个 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)。无论如何,并非没有超出内存复杂性的限制。
关于如何解决这个问题的任何想法(使用我当前的实现或不使用)?
【问题讨论】:
-
内存约束应该给你一个非常重要的线索:让它递归。画一棵树和图片子树。然后你会看到递归应该基于什么
-
@sehe:我实际上就是这样做的,这就是我得到第一个解决方案的方式。堆栈的使用是为了避免递归,因为在调用 ++ 运算符之间保持状态是一个主要问题。我想我只是没有看到如何在前进时更新后退数据