我正在使用递归在二进制搜索树中搜索元素,但是如果BST中不存在该元素,我的代码就会停止工作。
delimiter
答案 0 :(得分:2)
问题
如果此语句中root
为nullptr
:
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);
}
}
}