私はある値のバイナリツリーを検索するための反復関数を書いています。これは、クラスをジェネリック化する方法に入るまで、signed intにローカライズされています。バイナリツリーを検索する
私のクラスはBinarySearchTreeであり、ツリーのルートノードへのポインタを持っているものとします。また、ノードが挿入関数を介して挿入され、2つの子へのポインタを持つとします。
struct Node
{
public:
Node *left_, *right_;
int value_
Node(int val) : value_(val), left_(0), right_(0) { }
//done in this manner to always make sure blank children are
//init to zero, or null
Node(int val, Node *left, Node *right) : value_(val), left_(0), right_(0)
{ left_ = left; right_ = right; }
}
だから、あなたが安全に、ノードのUNINITポインタがNULLになると仮定することができます:ここにノード構造体の多くの簡略版です。ここで
は私のコードです:
int BinarySearchTree::search(int val)
{
Node* next = this->root();
while (next->left() != 0 || next->right() != 0)
{
if (val == next->value())
{
return next->value();
}
else if (val < next->value())
{
next = next->left();
}
else if (val > next->value())
{
next = next->right();
}
}
//not found
return 0;
}
このコードでは、二つの理由のために友人によって拒否されている:次の子がない場合は、両方がゼロと評価されますと、私は途中で終了します)
1ループ(私は決してnextの値に対して検索されたvalをチェックしません)。
2)次の子が1つの子であるが、検索しているデータがツリーの空の側にある場合は、次に0が設定され、次の(0)と左と右のツリーはwhile(0->left())
のようになり、結果として未定義の動作が発生します。
私は、両方の問題に対する解決策がループ状態にあると言われていますが、私は簡単に状況を改善するために何ができるのかわかりません。スタックオーバーフローのコミュニティは何か洞察を提供できますか?
while (next != NULL)
:
宿題タグを追加しました。これは宿題ではなく、私は学校にいない、これは趣味です。 – jkeys
@Hooked:アルゴリズムタグを追加したところです。また、私はちょうどほぼ同じコードを投稿したが、私のポストを読むことを実現... intの代わりにboolを返すことを検討してください。 – Tom
@Hooked:犯罪は意図されていません。私は単に「コードが拒絶された」と誤解しました。あなたの友人は拒否しているので、それは宿題だったからだと思っていた理由はありませんでした。答えを出すことは悪い形になるでしょう。 – tvanfosson