使用trie

时间:2017-02-28 02:41:36

标签: c++ c trie

我正在使用trie在字典中使用c

中的以下结构
  struct trie_node {
    int is_end;   //0 is is not the end of the word ,otherwise 1
    char c;       
    struct trie_node* child[26];
  };

我可以插入单词,搜索单词,我想打印字典中的所有单词。不知道如何处理它。我正在尝试打印

void print(struct trie_node node) {
int i = 0;
 for (i = 0; i < 26; i++) {
    if (node->child[i] != NULL) {
       printf("%c", node->child[i]->c);
       print(node->child[i]);
    }
 }

}

但是打印不正确 如果例如我有话 啤酒 蜜蜂 熊 兽

是打印 bearster 它应该打印 bearbeastbeebeer

如何正确打印单词列表?

2 个答案:

答案 0 :(得分:2)

您需要跟踪路径(从根到当前节点的路径)。当您到达结束节点(is_end为true)时,您将打印作为字典单词的路径。

一种方法是使用char数组并跟踪其长度,以便了解需要打印的元素数量。请参阅以下代码:

void print_path (char *path, int len){
  int i;
  for(i = 0; i < len; i++)
    printf("%c", path[i]);
}
void print(struct trie_node* node, char *path, int len) {
  // sanity check
  if (! node)
    return;

  // current node is part of the current path, so add it
  path[len++] = node->c;

  // if it is an end node then print the path
  if (node->is_end)
    print_path(path, len);  

  // now go through the children and recursive call 
  int i = 0;
  for (i = 0; i < 26; i++) {
    if (node->child[i] != NULL) {
      print(node->child[i], path, len);                     
    }
  }
}

int main(){
  // proper allocation for the trie
  // ...
  // calling the print, assuming the height of tree is at most 128
  char path[128];
  print(b, path, 0);
}

答案 1 :(得分:0)

你可以尝试使用node.child [i] - &gt; c,当使用struct var时你必须使用“。”,当使用struct point时必须使用“ - &gt;”或“(&amp; point)。”,我不知道我的想法是真的:)。