在BST中搜索不存在的电影节点时出现段错误求助
BST查找电影节点时不存在目标出现段错误的排查与修复
我正在二叉搜索树(BST)中查找包含指定信息的电影节点,搜索存在的电影时代码运行正常,但搜索不存在的电影时会出现段错误。我认为当目标不存在时,程序最终会到达叶子节点,返回其左或右子节点(即nullptr),却找不到问题所在,恳请帮助排查。
我的代码如下:
void MovieCollection::showMovie(string movieName) { Movie *movie = showMovieHelper(root, movieName); cout << movie << endl; if (movie == nullptr) { cout << "Movie not found." << endl; return; } else { cout << "Movie:" << endl; cout << "==================" << endl; cout << "Name :" << movie->movieName << endl; cout << "Director :" << movie->director << endl; cout << "Genre :" << movie->genre << endl; } return; } Movie* MovieCollection::showMovieHelper(Movie *movie, string name) { if ( movie->movieName == name || movie == nullptr ) { return movie; } else { vector<string> s; s.push_back(name); s.push_back(movie->movieName); sort(s.begin(),s.end()); Movie* node; if (s.at(0) == name) { return showMovieHelper(movie->left, name); } else { return showMovieHelper(movie->right, name); } } }
错误原因分析
空指针访问(核心问题)
在showMovieHelper的判断条件中,你先执行movie->movieName == name,再检查movie == nullptr。当递归到空节点时,movie已经是nullptr,此时访问movie->movieName会直接触发段错误——空指针没有对应的内存地址,无法访问成员变量。BST搜索逻辑冗余低效
用vector加排序的方式判断左右子树完全没必要。BST的核心特性是左子树节点值小于当前节点,右子树大于当前节点,直接用字符串比较即可,不需要额外容器排序。
修复方案
修复后的showMovieHelper函数
Movie* MovieCollection::showMovieHelper(Movie *movie, string name) { // 先检查节点是否为空,为空直接返回 if (movie == nullptr) { return nullptr; } // 找到目标节点,返回 if (movie->movieName == name) { return movie; } // 目标值小于当前节点,递归左子树 if (name < movie->movieName) { return showMovieHelper(movie->left, name); } // 目标值大于当前节点,递归右子树 return showMovieHelper(movie->right, name); }
额外优化建议
- 移除
showMovie中多余的cout << movie << endl;,这行代码仅输出指针地址,对用户无实际价值,且当movie为nullptr时输出0,容易造成混淆。 - 如果业务允许,可以考虑字符串比较忽略大小写,避免因大小写差异导致合法查找失败。
内容的提问来源于stack exchange,提问作者Wofster
相关产品推荐
相关产品推荐

