Keshav Goel
Keshav Goel

Reputation: 74

Trying TRIE DS implementation

So, I'tried implementing TRIE DS, and while the node in the tree gets the value of Words assigned after addWord ends, but when I traverse the tree, The value that prints is zero. What did I do wrong, unable to point out. Please can someone help.

    #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;
    }

Upvotes: 0

Views: 30

Answers (1)

Shihab Shahriar Khan
Shihab Shahriar Khan

Reputation: 5455

There are two issues with code:

  1. In your addWord function, inside else block, in the for loop, change vertex->edges[i] = NULL; to n->edges[i] = NULL;
  2. The problem you asked for is in your traverse function. You are not printing the words count for node pointed by say last o, you are printing it for the node that have o as it's edge. So just change this:

    cout<<char(i+'a')<<" - "<<vertex->prefixes<< " : "<<vertex->words<<endl;

to this:

cout<<char(i+'a')<<" - "<<vertex->edges[i]->prefixes<< " : "<<vertex->edges[i]->words<<endl;

Upvotes: 1

Related Questions