2015-03-28 6 views
0

Заполнение trie без проблем. Слова не содержат чисел или пробелов и только строчные буквы.Печать слов в trie в C

printTrieContents использует буфер, размещенный в основном.

ПРОБЛЕМА: , если в три содержит слова «баллы» и «что-то», «баллы» будут напечатаны, а «что-то» не будет.

Все остальное в порядке.

struct trieNode { 
    int count; 
    struct trieNode *children[ALPHA_SIZE]; 
}; 


void printTrieContents(struct trieNode *root, char *buffer, int buffIndex){ 
     int i; 
     for(i = 0; i < ALPHA_SIZE; i++){ 
       if(root->children[i] != NULL){ 
         buffer[buffIndex] = i + 'a'; 
         printTrieContents(root->children[i], buffer, buffIndex + 1); 
       } 
       if(!hasChildren(root)){ 
         buffer[buffIndex] = '\0'; 
         if(strlen(buffer) > 0){ 
           printf("%s: %d\n", buffer, root->count); 
           buffIndex = 0; 
         } 
       } 
     } 
} 

int hasChildren(struct trieNode *root){ 
     int i; 
     for(i = 0; i < ALPHA_SIZE; i++){ 
       if(root->children[i] != NULL){ 
         return 1; 
       } 
     } 
return 0; 
} 
+2

Это не связано с вопросом, но вам нужен дополнительный бит в узле, иначе вы не узнаете, является ли префикс слова также словом. Например: {"a", "at", "atrium"}. –

ответ

1

Вы в конце концов переходите к листу. На данный момент, будучи листом, у вас нет детей. вы прикрепляете нуль и устанавливаете значение buffIndex равным. Вы не выходите, но вы продолжаете вращаться, то есть вы вернетесь в это предложение и установите буфер [0] равным Null, эффективно очистив строку, в конце концов вы вернетесь назад и перейдете к следующему ребенку.

редактировать: Когда вы обнаружите, что вам нужно прикрепить нуль, вместо установки buffIndex (обратите внимание, buffIndex является локальным для текущего кадра, установка не будет иметь никакого влияния на остальной части вашего стека вызовов) вернуть. Вы начнете рекурсировать резервное копирование своего стека. Затем вы вернетесь к кадру с большим количеством детей, и вы можете начать итерацию над другими детьми, перезаписать буфер своей новой строкой и напечатать новые слова.