宿題の割り当てに 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;
}
私はそれをテストする必要はありませんが、うまくいくはずだと思います。私の問題は、後退 (--) 演算子を実装しようとしたときに始まりました。私の最初のアプローチは、2 番目のスタックである recedeStack を用意し、++ 演算子に使用したのと同じ方法で使用することでした。しかし、後退スタックを ++ 演算子で同期させ、その逆 (- 演算子での AdvanceStack) を維持する方法がわかりませんでした。とにかく、メモリの複雑さの制限を超えていないわけではありません。
この問題を解決する方法についてのアイデアはありますか (現在の実装の有無にかかわらず)?