递归:按顺序遍历返回列表

时间:2013-07-15 19:06:07

标签: c++ algorithm recursion binary-search-tree

我有一个基本功能,在C ++中执行顺序遍历

void inorder(Node *root)
{
    if(root != NULL)
    {
       inorder(root->left);
       cout<<root->data<<endl;
       inorder(root->right);
    }
}

但是,我希望在遍历顺序中返回一个列表。但关键是我们如何确定这个递归函数何时实际结束并且我可以返回列表。这是我到目前为止所做的代码;

vector<int> inorder(Node *root, vector<int> listToAdd)
{
    if(root != NULL)
    {
       inorder(root->left, listToAdd);
       listToAdd.push_back(root->data);
       inorder(root->right, listToAdd);

       //return here?
    }
    // return here?
}

我认为这个问题的答案也会帮助我解决递归的核心概念

2 个答案:

答案 0 :(得分:7)

  

关键是我们如何确定这个递归函数何时实际结束

与普通函数一样,递归函数在其调用的最高级返回时立即结束。你的函数的问题是它试图构造一个列表,并返回它;它应该做一个或另一个。

构建列表很简单 - 创建函数void,并按如下所示进行更改:

void inorder(Node *root, vector<int>& listToAdd)
{
    if(root != NULL)
    {
       inorder(root->left, listToAdd);
       listToAdd.push_back(root->data);
       inorder(root->right, listToAdd);
    }
}

就是这样!我做的两个改变是通过引用引用参数,并返回void。按如下方式调用您的函数:

vector<int> inorderList;
inorder(myNode, inorderList);

如果您想要返回列表,可以按如下方式修改函数:

list<int> inorder(Node *node) {
    if (root != NULL) {
        list<int> lhs = inorder(node->left);
        list<int> rhs = inorder(node->right);
        copy(rhs.begin(), rhs.end(), back_insert_iterator<list<int> >(lhs));
        return lhs;
    } else {
        return list<int>();
    }
}

请注意,第二种选择需要更多复制。

答案 1 :(得分:0)

如果将return语句放在if的主体内,那么在root为null的情况下你不会遇到return语句。这看起来很糟糕。现在,考虑如果将返回放在函数末尾(在条件之外)会发生什么。现在,无论root是否为null,都将返回返回值,这就是你想要的。

那就是说,你应该考虑当你进行这两个递归调用时会发生什么。您是否依赖递归调用返回vector<int>现在还有其他项目?如果是这样,那么你可能应该从调用inorder中获取返回的值并对其执行某些操作而不是忽略它。希望有所帮助。

相关问题