Тр ie дает ошибку сегментации - PullRequest
0 голосов
/ 17 февраля 2020

В другой день еще одна ошибка сегмента, которую я не понимаю, я пытаюсь выполнить попытки в первый раз, и это оказывается довольно сложной задачей, я думаю, было бы очень полезно, если бы кто-то мог сказать мне, что я ' я делаю неправильно, вероятно, помог бы мне понять OOP также лучше, я полагаю, потому что я думаю, что ошибка связана с этим.

Ошибка возникает при поиске, и я не смог ее понять сам использую отладчик.

Вот код:

#include <vector>
#include <iostream>

using std::string, std::cout, std::vector;

class TrieNode {
    private: 
        bool isLeaf;
        vector<TrieNode*> ar = vector<TrieNode*>(26);

    public:
        TrieNode() {
            isLeaf = false;
            for(int i = 0; i < 26; i++) ar[i] = nullptr;
        }

    void insert(TrieNode *root, string key) {
        TrieNode *crawl = root;
        for(int i = 0; i < key.size(); i++) {
            if(!crawl->ar[key[i]]) {
                crawl->ar[key[i]] = new TrieNode();
            }
            crawl = crawl->ar[key[i]];
        }
        crawl->isLeaf = true;
    }

    bool search(TrieNode *root, string key) {
        TrieNode *crawl = root;
        for(int i = 0; i < key.size(); i++) {
            if(!crawl->ar[key[i]]) {
                return false;
            }
            crawl = crawl->ar[key[i]];
        }
        return crawl->isLeaf;
    }
};

int main() {
    TrieNode* head = new TrieNode();
    head->insert(head, "hello");
    cout << head->search(head, "hello");
}

1 Ответ

4 голосов
/ 17 февраля 2020

Сделайте из ar[key[i]] что-то вроде ar[key[i]-'a'], если ваша строка, скажем, всегда строчная.

По сути, ключ [i] - это символ в диапазоне ['a' - 'z «]. Когда он неявно преобразуется в int, он не находится в диапазоне [0,25], а скорее равен их значениям ascii.

...