Data structures 尝试TRIE-DS实现

Data structures 尝试TRIE-DS实现,data-structures,trie,Data Structures,Trie,因此,我尝试实现TRIE-DS,虽然树中的节点获得addWord结束后分配的单词值,但当我遍历树时,打印的值为零。我做错了什么,无法指出。请找个人帮忙 #include<iostream> #include<string> using namespace std; struct trie{ int words; int prefixes; trie* edges[26]; };

因此,我尝试实现TRIE-DS,虽然树中的节点获得addWord结束后分配的单词值,但当我遍历树时,打印的值为零。我做错了什么,无法指出。请找个人帮忙

    #include<iostream>
    #include<string>

    using namespace std;

    struct trie{
        int words;
        int prefixes;
        trie* edges[26];
    };

    void addWord(trie* vertex, string word){

        if(word.length() == 0){
            vertex->words = vertex->words + 1;
        }
        else{
            // cout<<word<<endl;
            vertex->prefixes = vertex->prefixes + 1;
            char k = word[0];
            if(vertex->edges[k - 'a'] == NULL){
                trie *n = (trie*)malloc(sizeof(trie));
                n->words = 0;
                n->prefixes = 0;
                for(int i=0;i<26;i++)
                    vertex->edges[i] = NULL;
                vertex->edges[k - 'a'] = n;
            }
            word.erase(0, 1);
            addWord(vertex->edges[k - 'a'], word);
        }
    };
    void traverse(trie *vertex){
        if(vertex != NULL){
            for(int i=0;i<26;i++){
                if(vertex->edges[i] != NULL){
                    traverse(vertex->edges[i]);
                    cout<<char(i+'a')<<" - "<<vertex->prefixes<< " : "<<vertex->words<<endl;
                }
            }
        }

    };


    int main(){
        string word = "hello";
        trie* head = (trie*)malloc(sizeof(trie));
        for(int i=0;i<26;i++)
            head->edges[i] = NULL;
        head->words = 0;
        head->prefixes = 0;
        addWord(head, word);
        string s = "lo";
        traverse(head);
        return 0;
    }
#包括
#包括
使用名称空间std;
结构trie{
智力词;
int前缀;
trie*边[26];
};
void addWord(trie*顶点,字符串字){
if(word.length()==0){
顶点->单词=顶点->单词+1;
}
否则{
//coutwords=0;
n->前缀=0;
for(int i=0;iedges[i]=NULL;
顶点->边[k-'a']=n;
}
字擦除(0,1);
添加单词(顶点->边[k-'a'],单词);
}
};
空心导线测量(trie*顶点){
如果(顶点!=NULL){
for(int i=0;iedges[i]!=NULL){
遍历(顶点->边[i]);

cout代码有两个问题:

  • addWord
    函数中,在
    else
    块内,在
    for
    循环中,将
    vertex->edges[i]=NULL;
    更改为
    n->edges[i]=NULL;
  • 您要求的问题是在
    遍历
    函数中。您没有打印say last
    o
    所指节点的
    单词数,而是打印具有
    o
    作为其边缘的节点。因此,只需更改此项:


    你能在调试器中单步执行代码以查看其偏离轨道吗?如果不能,那么我会说这就是你做错的地方。@JimMischel,有什么特别的建议吗,特别是对于简单的单文件c/c++?建议什么?我的具体建议是启动调试器并单步执行代码,这样你就可以看到如果你不知道如何使用调试器,现在是学习的最佳时机。
    
    cout<<char(i+'a')<<" - "<<vertex->edges[i]->prefixes<< " : "<<vertex->edges[i]->words<<endl;