在c++中实现Trie时出现分段故障

问题描述 投票:0回答:1

又是一天,又是一个我不理解的seg故障,我第一次尝试实现tries,事实证明这是一个相当大的挑战,我想如果有人能告诉我我做错了什么,会很有帮助,可能也会帮助我更好地理解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");
}
c++ pointers data-structures trie
1个回答
4
投票

让你的 ar[key[i]] 到类似 ar[key[i]-'a'] 如果你的字符串总是小写的话。

基本上,key[i]是一个范围为['a'-'z']的char,当它隐式转换为int时,它不是在[0,25]的范围内,而是等于它们的ascii值。当它被隐式转换为 int 时,它不是在 [0,25] 的范围内,而是等于它们的 ascii 值。

© www.soinside.com 2019 - 2024. All rights reserved.