如何在Binary Search Tree中查找checkV值并输出对应true或false结果
二叉搜索树值存在性检查代码问题分析与修正
原有代码存在的逻辑错误
- 未处理空指针边界:当传入的root为nullptr(比如树为空、或者遍历到叶子节点的空子节点)时,直接访问
root->data会触发空指针访问崩溃。 - 条件判断非互斥:三个if分支是独立执行的,就算匹配了前两个分支进入递归,返回后仍会执行后续的相等判断逻辑,最终大概率会额外输出错误的
false结果。 - 无递归终止控制:递归查找到目标值后不会终止流程,会逐层返回父节点继续执行代码,导致多次输出错误结果。
正确实现方案
推荐将查询逻辑和输出逻辑分离,复用性更强,实现代码如下:
// 核心搜索逻辑,返回布尔值表示是否存在目标值 bool search(Node* root, int checkV) { // 遍历到空节点说明未找到目标值 if (root == nullptr) { return false; } if (checkV == root->data) { return true; } // 大于当前节点值搜右子树,小于则搜左子树 return checkV > root->data ? search(root->right, checkV) : search(root->left, checkV); } // 调用侧负责输出结果 int main() { // 此处省略BST构建逻辑,假设已构建完成,根节点为root int target = 6; // 要检查的目标值 cout << (search(root, target) ? "true" : "false") << endl; return 0; }
如果要求必须在search函数内直接完成输出,可参考以下实现:
void search(Node* root, int checkV) { if (root == nullptr) { cout << "false" << endl; return; } if (checkV == root->data) { cout << "true" << endl; return; } // 互斥分支递归,递归完成后直接返回不执行后续逻辑 if (checkV > root->data) { search(root->right, checkV); } else { search(root->left, checkV); } }
内容的提问来源于stack exchange,提问作者Asithandile Ludonga
相关产品推荐
相关产品推荐

