在二进制搜索树中查找元素

时间:2017-06-22 19:37:59

标签: c++ algorithm data-structures binary-tree binary-search-tree

我编写此代码以在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";
}

3 个答案:

答案 0 :(得分: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 :(得分:1)

如果是梯形图,则问题在于输入的条件顺序。

请阅读我在代码行上写的评论

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

答案 2 :(得分:0)

如果节点是叶子,则没有任何情况。在致电fetch(root->left,d)fetch(root->right,d)之前,请先通过检查是否(root-&gt;(左/右)!= NULL)确保节点有左或右元素,然后再次调用fetch。如果它们= = NULL,那么当你导航到树的底部并且没有找到你的元素时,你可以返回NULL。