C++ AVL树如何根据指定phoneNo值返回对应节点的key
问题原因
你的SearchKeybyPhone递归查找函数存在两处核心逻辑错误,是返回值异常的直接原因:
- 递归调用左右子树查找时,没有接收和回传子树的查找结果,就算子树中找到了匹配节点,正确的key也无法传递回上层调用,最终函数因执行完所有逻辑未显式返回值,触发未定义行为,返回栈内存中的随机值,也就是你拿到的错误结果4306440216。
- 没有处理空节点的返回逻辑,函数声明要求返回long long类型,但空节点分支、未找到匹配节点的场景都没有定义返回值,进一步加重了未定义行为。
修复方案
将Node.cpp中的SearchKeybyPhone函数替换为如下代码即可:
long long Node::SearchKeybyPhone(Node* root, string phoneNo) { // 空节点返回-1作为未找到标记,你的哈希key为正数,不会与有效key冲突 if (root == NULL) { return -1; } // 当前节点匹配直接返回对应key if (root->phoneNo.compare(phoneNo) == 0) { cout << "Expected return value: " << root->key << endl; return root->key; } // 优先返回左子树的查找结果 long long left_result = SearchKeybyPhone(root->left, phoneNo); if (left_result != -1) { return left_result; } // 左子树未找到则返回右子树的查找结果 return SearchKeybyPhone(root->right, phoneNo); }
可选优化点
你当前读取CSV的逻辑使用while (!myFile.eof())判断会导致最后一行多读一次,容易插入无效空节点,建议调整为将读id的getline作为循环判断条件,避免无效数据插入。
内容的提问来源于stack exchange,提问作者Edison1235
相关产品推荐
相关产品推荐

