0

BSTでノードを見つけるためにこのコードを書いています。コードは正常に動作しますが、ノードが見つからないとコードがクラッシュします。バイナリ検索ツリーで要素を検索する

私のコードでは、どのようなエラーが考えられますか?

TreeNode* fetch(TreeNode*root,int d) 
    { 
       if(root->data==d) 
       { 

        return root; 
       } 
       else if(root==NULL) 
       { 

        return NULL; 
       } 

       else if(d<root->data) 
       { 

        return fetch(root->left,d); 
       } 
       else if(d>root->data) 
       { 

        return fetch(root->right,d); 
       } 

    } 
    TreeNode* temp; 
    temp=fetch(root,d); 
    if(temp->data) 
    { 
     cout<<temp->data<<" FOUND"; 
    } 
else if(temp==NULL) 
{ 
    cout<<"Not Found"; 
} 

答えて

1

fetch()関数で注文を調整する必要があります。現時点では、存在しない可能性のあるノード内のデータがdに等しいかどうか最初にチェックするため、root == NULLの場合はエラーになります。以下の通りである。修正:さらに

TreeNode* fetch(TreeNode*root,int d) 
{ 
      if(root==NULL) 
      { 

       return NULL; 
      } 
      else if(root->data==d) 
      { 

       return root; 
      } 

      else if(d<root->data) 
      { 

       return fetch(root->left,d); 
      } 
      else if(d>root->data) 
      { 

       return fetch(root->right,d); 
      } 

} 

あなたは同じ理由で一番下にあなたのチェックの順序を変更する必要があります。

if(temp==NULL) 
    { 
     cout<<"Not Found"; 
    } 
else 
{ 
    cout<<temp->data<<" FOUND"; 
} 
-1

ノードが葉である場合は、何のケースを持っていません。 fetch(root->left,d)またはfetch(root->right,d)を呼び出す前に、フェッチを再度呼び出す前に、(ルート - >(左/右)!= NULL)をチェックして、ノードに左または右の要素があることを確認してください。それらが== NULLなら、あなたはツリーの一番下までナビゲートし、あなたの要素を見つけられなかったので、NULLを返すことができます。

+0

に書かれているコメントを読んでください、 NULL状態は最初にチェックする必要があります –

+0

イーストンボルネミエの修正はこれよりも簡潔であり、同じ問題に対処します – littlespice3

+0

私もそう思っていましたが、人々は不完全な回答を編集し、否定的 - .- –

0

問題は、ラダーの場合は、他の場合に入れられる条件のシーケンスにあります。

私は、これは単にNULL値を持つ関数を入力して、NULL条件ごとに返す必要があり、これは、必要はありませんあなたのコードの行

TreeNode* fetch(TreeNode*root,int d) 
     { 
        if(root->data==d) /* if d doesn't exists, root becomes 
             null and dereferencing a null 
             gives error, i.e, null->data is 
             error. So, first root=null should 
             be checked*/ 
        { 

         return root; 
        } 
        else if(root==NULL) 
        { 

         return NULL; 
        } 

        else if(d<root->data) 
        { 

         return fetch(root->left,d); 
        } 
        else if(d>root->data) 
        { 

         return fetch(root->right,d); 
        } 

     } 
     TreeNode* temp; 
     temp=fetch(root,d); 
     if(temp->data) // temp=NULL should be must codition 
     { 
      cout<<temp->data<<" FOUND"; 
     } 
    else if(temp==NULL) 
    { 
     cout<<"Not Found"; 
    } 
関連する問題