【问题标题】:Traversing a binary tree using a vector return type使用向量返回类型遍历二叉树
【发布时间】:2022-01-11 05:21:08
【问题描述】:

我正在尝试使用键值对遍历模板化的 AVLtree 并返回所有值的向量。

当使用 cout 语句时,我可以看出该函数正在正确地遍历树并且它将返回树中的所有值。但是,当我尝试将其添加到向量并在程序的另一部分中使用它时,只存储了根节点。


    vector<s> treeTraversal(){
         return treeTraversal(root);
    }

    vector<s> treeTraversal(AVLNode<t, s> *node ){
        vector<s> temp;

        if(node != nullptr){
            treeTraversal(node -> left);
            treeTraversal(node -> right);
            temp.push_back(node -> vectorToBe);
        }

        return temp;
    }

我打算将所有返回的值存储在一个向量中,以便我可以在程序的后面部分访问它们

【问题讨论】:

  • 您是否看到对 treeTraversal 的调用,返回的值被完全忽略?制作函数[[nodiscard]],你的错误会报告给你。

标签: c++ vector binary-search-tree nodes


【解决方案1】:
treeTraversal(node -> left);

这递归调用函数,这是两个递归调用之一。您的 treeTraversal() 函数返回一个向量。但是,在这里,它的返回值被丢弃了,没有存储在任何地方。

return temp;

这是您的函数returns 的向量。但是,正如我们所见,它不包括从任何递归调用返回的任何内容,因为这些返回值被丢弃并被忽略。

有两种常用的方法来解决这个问题:

  1. 不要忽略两个递归调用返回的向量。存储它们,然后将它们的内容附加到temp

  2. 不要返回std::vector,而是将其作为递归调用的附加参数。每个递归调用只是将其值附加到传入的向量(并将其转发给任何后续递归调用)。递归函数的调用者将负责实例化一个最初为空的向量,并将其传入。

【讨论】:

  • 我刚刚注意到您的#2 项目符号中明确提到了我的解决方案。 :/ 我的错。
【解决方案2】:

我会尝试这样的事情。您将避免在堆栈中创建大量 vector&lt;s&gt;s。

vector<s> treeTraversal(){
     vector<s> result;
     treeTraversal(root, result);
     return result;
}

void treeTraversal(AVLNode<t, s> *node, vector<s>& visited ){
    if(node != nullptr){
        treeTraversal(node -> left, visited);
        treeTraversal(node -> right, visited);
        visited.push_back(node->vectorToBe);
    }
}

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 2012-01-01
    • 2022-11-11
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2017-08-23
    相关资源
    最近更新 更多