在递归二进制搜索树中搜索

时间:2018-10-19 17:23:47

标签: c++ algorithm pointers binary-search-tree

我正在使用递归在二进制搜索树中搜索元素,但是如果BST中不存在该元素,我的代码就会停止工作。

delimiter

3 个答案:

答案 0 :(得分:2)

问题

如果此语句中rootnullptr

    if(root->key==key||root==NULL)

在检查它是否为root->key之前,首先应使用NULL(即UB)取消引用空指针。

解决方案

反之亦然:

    if(root==nullptr||root->key==key)

在这种情况下,如果root为NULL,则立即执行if子句。仅当root不为NULL时,指针才会被取消引用。

注意: ,即使没有找到该元素,您也会知道已找到该元素(即,root到达了nullptr,而没有遇到正确的密钥)。考虑对nullptr(表示未找到)和相等(表示已找到)有不同的区分。

答案 1 :(得分:2)

您在此处取消引用NULL指针:

if(root->key==key||root==NULL)
{
    cout<<"Congratulation Element found in the BST"<<"\n";
    return;
}

||运算符首先评估左侧,如果值为 then ,它将评估右侧。因此,在检查root是否为NULL之前应先取消引用。

首先执行NULL检查,如果找到NULL指针则返回:

void tree::searching(node *root,int key)
{
    if (root == nullptr) {
        return;
    }

    if(root->key==key) {
        cout<<"Congratulation Element found in the BST"<<"\n";
    } else if(key<root->key)
        searching(root->left,key);
    } else {
        searching(root->right,key);
    }
}

答案 2 :(得分:0)

您打印得太早了。如果程序走到叶子,它将打印出来,因为拳头中的表达式if将被评估为true。

void tree::searching(node *root,int key)
{
    if (root == nullptr)
    {
        return;
    }
    if(root->key==key)
    {
        cout<<"Congratulation Element found in the BST"<<"\n";
        return;
    }
    else
    {
        if(key<root->key)
        {
            searching(root->left,key);
        }
        else
        {
            searching(root->right,key);
        }
    }

 }