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()函數中調整您的排序。現在,如果root == NULL,它將會出錯,因爲它首先檢查潛在不存在的節點中的數據是否等於d。修正如下:

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)之前,在再次調用fetch之前,通過檢查是否(root - >(left/right)!= NULL)確保節點具有左或右元素。如果他們執行== NULL,那麼您可以返回NULL,因爲您已經導航到樹的底部並且沒有找到您的元素。

+0

這不應該是必要的註釋,這應該只是一個NULL值輸入功能,然後每空狀態返回時,空條件只需要先檢查 –

+0

伊斯頓Bornemeier的修復比這個更簡潔,並解決了同樣的問題 – littlespice3

+0

我也這麼認爲,但人們可以認爲只是編輯他們對我的不完整答案,並得到它標記正確,而我仍然是 - –

0

問題是如果條件放在梯子的順序中。

請閱讀我寫的代碼的行

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"; 
    }