2011-09-14 22 views
0

スタックを使用してBSTの高さを取得しようとしています。私はプリオーダーを使用して、スタックの最大サイズを調べるべきだと言われました。しかし、これは動作していないようです。私が間違っていることのアイデア。スタックを使用してBSTの高さを取得する

int PBT::maxDepth() { 
if (!root) { 
    return -1; 
} 
int depth=0; 
stack<TreeNode *>s; 
TreeNode * nodePtr=root; 
for (; ;) {   
    while (nodePtr) { 
     s.push(nodePtr); 
     if (s.size() > depth) 
      depth = s.size(); 
     nodePtr=nodePtr->left; 
    }if (s.empty()) { 
     break; 
    } 
    nodePtr=s.top(); 
    s.pop(); 
    nodePtr=nodePtr->right; 
} 
return depth; 

}

+0

(ノードポインタが.firstに明らかである)

s.push(make_pair(nodeptr, current_depth)); 

を押して、あなたがポップアップする前に、

current_depth = s.top().second; 

current_depthを復元することデバッガのコードをステップ実行して何が起こっているのかを確認します。 – NPE

+0

複数のケースを試して、予約注文に問題があるかどうかを確認しました。私はプリオーダーが動作することを知っています。 – Aaron

+0

あなたのコードはどのように機能していませんか?単純なツリーの例、実際の出力と予想される出力の両方を出力できますか? – NPE

答えて

1

スタックサイズは、いくつかのノードに対する深さの誤った値です。例えば。現在のノードが他のノードの右の子である場合、スタックはこの他のノード(私たちの親)を含みません。ツリーの最右ノードの場合、スタックにはアイテムはありません。

深度を正しく計算する必要があります。あなたのケースでは、あなたは1つのポップでさらにレベルを上げるかもしれないので、1つを引くことはできませんが、あなたの現在の深さをスタックに保存して(そしてポップ中に復元すると)うまくいくでしょう。

これを行うには、スタック定義をたとえば次のように変更する必要があります。

stack<pair<TreeNode*, unsigned> > stack; 

とし、変数current_depthを追加します。

各 "nodePtr=nodeptr->left/right"については、current_depthを増分します。私があなただったら、私は簡単なテストケースを見つけるだろう

+1

'depth'はこれまでに発見された最大深度です。それをリセットすることは意味をなさないでしょう。 – interjay

+0

私は参照してください。私は自分の答えを編集しました。 – jpalecek

+0

私は、スタックの値をポップする前に、正しい子の変数に追加していないという問題がまだ残っていることを試みました。 – Aaron

関連する問題