2015-10-20 3 views
1

У меня возникли проблемы распечатывания слова из trie в C. Я реализовал trie так:Trie Печать в C

struct trie { 

struct trie *children[26]; 
char letter; 
int wordEnd; 

}; 


void printSubtree(struct trie *subtree) { 
    int i; 
    if (subtree == NULL){ 
     return; 
    } 
    else { 
     for (i = 0; i<26;i++) { 
      if (subtree->children[i]!= NULL) { 
       printf("%c", subtree->children[i]->letter); 
       printSubtree(subtree->children[i]); 
      } 
     } 
    } 
} 

void printResult(){ 
    struct trie *temp; 
    temp = master; 
    int i ; 
    if (temp){ 
     for (i = 0; i<26;i++) { 
      if (temp->children[i]!= NULL) { 
       printf("%c", temp->children[i]->letter); 
       printSubtree(temp->children[i]); 
       printf("\n"); 
       printf("\n"); 
      } 
     } 
    } 
} 

Я знаю, что это не правильно, но я не конечно, как использовать рекурсию для печати слов. Если trie имеет "abc" и "abe", хранящиеся как отдельные слова, то заканчивается печать только строка "abce", вставка как "abc", так и "abe" в виде разных слов. Впоследствии я не уверен, как использовать DFS для его распечатки, потому что не будет DFS до конца до "abc", распечатайте это, а затем вернитесь на уровень "b", см., Что "b" имеет детей, которые не имеют и затем распечатать его, в результате чего строка "abce" в любом случае?

+2

Возможно, вам нужно сохранить целую строку, которая представляет слово до сих пор и к которому вы добавляете буквы, когда вы спускаетесь на три. Когда вы найдете слово, напечатайте эту строку. Вы не можете просто печатать буквы по мере их поступления, потому что они будут печататься только один раз, но могут принадлежать нескольким словам. –

ответ

3

Подходящим способом печати содержимого trie будет использование пользовательского стека, который хранит символы в пути от корня до текущего узла. При каждом рекурсивном вызове помещается символ, содержащийся в посещенной записке; при выходе из узла верхняя часть стека будет выскользена. Каждый раз, когда лист trie достигается рекурсивно, весь стек будет напечатан. Если поиск по глубине используется без определенного пользователем стека, путь от корня к текущему узлу представлен неявно в стеке вызовов, к которому невозможно получить доступ напрямую.