如何从递归算法返回节点?

时间:2017-03-14 00:22:47

标签: c++ recursion tree

一旦找到与节点键对应的值,我只需要将该节点返回到调用它的位置。

MovieNode *found = searchRecursive(root, title);

基于我的cout语句,它已被发现,但当我在main()中打印回来时,我会变得胡言乱语。有趣的是,当节点在main()中打印时,该节点不为空,但它会多次打印问号图标和几个数字。

struct MovieNode{
    int ranking;
    std::string title;
    int year;
    int quantity;
    MovieNode *parent;
    MovieNode *left;
    MovieNode *right;

    MovieNode(){};

    MovieNode(int in_ranking, std::string in_title, int in_year, int in_quantity)
    {
        ranking = in_ranking;
        title = in_title;
        year = in_year;
        quantity = in_quantity;
        parent = NULL;
        left = NULL;
        right = NULL;
    }
};

MovieNode* MovieTree:: searchRecursive(MovieNode *node, std::string value)
{
    if(node->left != NULL){
        searchRecursive(node->left, value);
    }

    if(node->title == value){ //in order
        cout<<"found"<<endl;
        cout<<node->title<<endl;
        return node;
        }

    if(node->right != NULL){
        searchRecursive(node->right, value);
    }
}

2 个答案:

答案 0 :(得分:3)

而不只是调用searchRecursive(...)执行此操作:

auto* r = searchRecusive(...)
if (r) return r;

在函数的末尾

return nullptr;

所以你得到:

MovieNode* MovieTree::searchRecursive(MovieNode* node, std::string const& value) {
  if(node->left != nullptr) {
    auto* r = searchRecursive(node->left, value);
    if (r) return r;
  }

  if(node->title == value){ //in order
    std::cout<<"found\n";
    std::cout<<node->title<<std::endl;
    return node;
  }

  if(node->right != nullptr) {
    auto* r = searchRecursive(node->right, value);
    if (r) return r;
  }
  return nullptr;
}

还有其他一些小修正。

答案 1 :(得分:0)

您的函数实现具有未定义的行为。首先,节点可以等于nullptr,其次,某些路径中的函数不返回任何内容。

该功能可以通过以下方式定义

MovieNode * MovieTree::searchRecursive(MovieNode *node, const std::string &value)
{
    if ( node )
    {
        if ( value < node->title )
        {
            node = searchRecursive(node->left, value);
        }
        else if ( node->title < value )
        {
            node = searchRecursive(node->right, value);
        }
    }

    return node;
}

我认为树是根据数据成员标题排序的。