Векторные указатели с векторными срезами для генерации дерева из векторов предзаказа и неупорядочения - PullRequest
0 голосов
/ 20 апреля 2019

Я получаю следующую ошибку:

solution.cpp: в функции-члене buildTree Строка 26: Char 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);

Для вектора предзаказа я просто хочу вырезать элементы впереди (те, что перед индексом),поэтому я подумал, что просто передам указатель на этот элемент вектора.

Для вектора порядка я хочу вырезать элементы ПОСЛЕ индекса.

По-питонски это будет простоpreorder [index:] inorder [: index]

Но я получаю ошибку при вызове функции.

Как мне сделать это в C ++?

Спасибо.

1 Ответ

0 голосов
/ 20 апреля 2019

Ваши функции берут ссылки; Вы передаете указатели.

Существует путаница в том, что означает &.

Это любой из:

  • побитовый оператор AND при применении между двумя выражениями
  • оператор "address-of" при применении к одному оператору, что приводит к указателю
    • это то, что вы делаете в вызовах функций
  • «ссылка» при добавлении к имени типа
    • это то, что вы вводите в параметры своей функции

Короче, удалите & из своих звонков и просмотрите главу в своей книге C ++ об использовании ссылок.

Этот заголовок получает указатель на вектор целых чисел.

Нет, это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...