You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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);
        }
    }
}

错误原因分析

  1. 空指针访问(核心问题)
    在showMovieHelper的判断条件中,你先执行movie->movieName == name,再检查movie == nullptr。当递归到空节点时,movie已经是nullptr,此时访问movie->movieName会直接触发段错误——空指针没有对应的内存地址,无法访问成员变量。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:30:26