带有矢量切片的矢量指针,用于从前序和中序向量生成树

Posted

技术标签:

【中文标题】带有矢量切片的矢量指针,用于从前序和中序向量生成树【英文标题】:Vectors pointers with vector slices for Tree generation from preorder and inorder vectors 【发布时间】:2019-04-20 01:45:49 【问题描述】:

我收到以下错误:

solution.cpp:在成员函数 buildTree 第 26 行:字符 62:错误:没有匹配函数调用 'Solution::buildTree(__gnu_cxx::__alloc_traits, int>::value_type*, std::vector*)' root->left = buildTree(&preorder[index],&inorderslice); ^

在这段代码中:


class Solution 
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
        if(preorder.empty() || inorder.empty())
            return NULL;
        if(preorder.size() == 1) // preorder and inorder should always have the same length
        
            TreeNode *node = new TreeNode(preorder[0]);
            return node;
        
        // current root is the first entry of preorder
        TreeNode *root = new TreeNode(preorder[0]);
        // find the index of this number in inorder
        std::vector<int>::iterator it = std::find(inorder.begin(), inorder.end(), preorder[0]);
        int index = std::distance(inorder.begin(), it);
        std::vector<int> inorderslice = std::vector<int>(inorder.begin(), inorder.begin() + index);
        root->left = buildTree(&preorder[index],&inorderslice); // This line is a problem
        root->right = buildTree(&preorder[index+1],&inorder[index+1]); // This line is a problem
        return root;

    
;

我正在尝试解决一个问题,从它的前序和中序遍历向量生成一棵树。

我正在尝试以递归方式执行此操作,但在匹配执行递归的函数的变量类型时遇到问题。

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 

此标头正在接收一个指向整数向量的指针。

在我的算法中,我试图对输入向量进行切片以仅在递归中使用其中的一部分:

        std::vector<int> inorderslice = std::vector<int>(inorder.begin(), inorder.begin() + index);

对于预购向量,我只想剪切前面的元素(索引之前的元素),所以我想我只需传递一个指向该向量元素的指针。

对于中序向量,我想在索引之后剪切元素。

以pythonic的方式,这只是 预购[索引:] 中序[:index]

但我在调用函数时遇到错误。

如何在 C++ 中做到这一点?

谢谢。

【问题讨论】:

【参考方案1】:

你的函数需要引用;你在传递指针。

这里对&amp; 的含义存在混淆。

它是任何一个:

按位AND 运算符应用于两个表达式之间时 将“address-of”运算符应用于一个运算符时,会产生一个指针 这就是您在函数调用中所做的事情 添加到类型名称时的“引用” 这就是您在函数参数中添加的内容

简而言之,从您的调用中删除 &amp;,并查看您的 C++ 书中有关使用引用的章节。

此标头正在接收一个指向整数向量的指针。

不,不是。

【讨论】:

这是我最先想到的。事实上,我在开始时没有 &,但没有它我得到这个错误: solution.cpp: no matching function for call to 'Solution::buildTree(__gnu_cxx::__alloc_traits<:allocator>, int>::value_type&, std::vector&)' root->left = buildTree(preorder[index],inorderslice); // 这行有问题 ^ 您需要更仔细地考虑您的数据类型。您的函数接受向量,但您传递的是整数?为什么?也许您应该切换到迭代器范围? 我正在尝试将引用传递给向量中的特定索引。我刚开始使用 c++,并不真正知道如何使用迭代器。没有迭代器就不可能做我想做的事吗? @JoaoAntunes 所以对向量的第 n 个元素的引用不是对向量的引用? -- 不,向量的第 n 个元素是键入Tvector&lt;T&gt;,因此对第n 个元素的引用是T&amp;,而不是vector&lt;T&gt;&amp; &amp;preorder[index] -- 这是一个int *,即指向单个int的指针。你真的应该更熟悉你正在处理的类型。当您拥有的是地址/指针时,您使用术语“参考”。在 C++ 中,引用具有特定的含义,并不意味着“指针”。向量是一个类,它是动态数组的包装器。获取“其中的指针”并不会给您提供“缩减”版本的向量。我认为这就是您使用错误概念编写代码的地方。

以上是关于带有矢量切片的矢量指针,用于从前序和中序向量生成树的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode105 从前序和中序序列构造二叉树

javaleetcode105.从前序和中序遍历序列构造二叉树

数据结构/PTA-据后序和中序遍历输出先序遍历/树

5.根据前序和中序得到二叉树代码实现,根据中序和后序得到二叉树代码实现(JavaScript版)

已知先序和中序 求后序

何时使用前序、后序和中序二叉搜索树遍历策略