【问题标题】:Recursion: Returning a list in order traversal递归:按顺序遍历返回列表
【发布时间】:2013-07-13 18:28:43
【问题描述】:

我有一个在 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?
}

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

【问题讨论】:

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


    【解决方案1】:

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

    与普通函数一样,递归函数在其调用的顶层返回时立即结束。您的函数的问题在于它试图构建一个列表并返回它;它应该做一个或另一个。

    构造列表很简单——将你的函数设为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>();
        }
    }
    

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

    【讨论】:

      【解决方案2】:

      如果您将 return 语句放在 if 的主体中,那么在 root 为 null 的情况下您不会遇到 return 语句。这似乎很糟糕。现在,想想如果将 return 放在函数的末尾(条件之外)会发生什么。现在,无论 root 是否为 null,都将达到 return,这是您想要的。

      也就是说,您应该考虑进行这两个递归调用时会发生什么。您是否依赖递归调用来返回一个vector&lt;int&gt;,它现在有另一个项目?如果是这样,那么您可能应该将从调用返回的值 inorder 并对其进行处理,而不是仅仅忽略它。希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-03
        • 2016-04-30
        • 2014-03-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 2021-09-19
        相关资源
        最近更新 更多