2016-11-20 31 views
3

Cでバイナリ検索ツリーを作成しようとしています。whileループ条件チェック

私はほとんどの部分を分かっていますが、タスクを完了しても悩まされていました。

これは、ノードのデータ(この場合はtemp->data)を返すことになっている検索機能です。

char bst_search(int key){ 

tree_pointer temp = root; 

    while(temp != NULL){ 

     if(temp->key < key){ // navigate down the tree 
     temp = temp->right; 
     } else temp = temp->left; 

     if(temp->key == key){ 
     return temp->data; 
     } 

    }  

return NULL; 

} 

この関数は、バイナリツリー内ではなかったキーが(したがってNULLを返す必要があります)時に失敗したと保管:私は、次のようなコードを書いたとき

はしかし、それは私にエラーを与えて上に保存しましたクラッシュする。いくつかの可能性を試した後、キーチェックをwhileループの前部に動かすことでこの問題が解決されたことに気付きました。

char bst_search(int key){ 

tree_pointer temp = root; 

    while(temp != NULL){ 

     if(temp->key == key){ 
     return temp->data; 
     } 

     if(temp->key < key){ // navigate down the tree 
     temp = temp->right; 
     } else temp = temp->left; 

    } 

return NULL; 

} 

ループ条件(温度)内の変数は、そのループの本体のコードに変更があったとき、私は好奇心(一時はtemp-に変更されているように>左またはtemp->右)、ありません条件が再びチェックされる?

私はあなたのほとんどの人にとってかなり明白な何かを逃していると感じます。どんな助けもありがとう!

答えて

4

いいえ、whileループ(一般にC言語)は、条件変数が変更されたときに条件を再評価するように背中のことをしません。

声明:

if(temp->key < key) 
     temp = temp->right; 
    else 
     temp = temp->left; 

(StackOverflowの上であなたのコードを適切にフォーマットしてください)あなたはリーフノードに到達したときに

tempNULLを格納します。

ただし、すぐ後で、あなたは:if(temp->key == key)tempNULLの場合、これはクラッシュして燃焼します。

したがって、tempNULLの場合、temp->keyにアクセスしようとすると、ステートメントを並べ替えることができなくなります。

次のようにチェックを行うと、この種の分枝の標準的な方法は次のとおりです。

if(temp->key < key) 
     temp = temp->right; 
    else if(temp->key > key) 
     temp = temp->left; 
    else //temp->key == key 
     return temp->data; 
+0

コメントありがとうございました:Dの\ nは を、それはリーフノードに到達し、一時はNULLになると、いけませんwhileループブレーク(条件は!= NULLなので)、最後にNULLを返します。 –

+0

アルゴリズムは適切に動作するためには*すべきですが、その必要があります。これはあなたがしていたことではありません。私の答えの修正を見てください。 –

+1

Cは状態マシンのように動作します。反復ごとに条件をチェックするだけです。とにかく、私はgdb、lldbなどのデバッガを使用してコードをステップ実行するように言いたいと思っていました。あなたはすぐにこれらのようなエラーをキャッチします。 – vindarmagnus