插入
Coddy 字典树:数据结构系列第 8 课 课程的第 5 课,共 14 课。
要将一个单词插入字典树,从根节点开始,每次沿着一个字符向下遍历。对于单词中的每个字符:如果当前节点没有该字符对应的子节点,就创建一个新的 TrieNode 并将其连接上。无论是否创建,都移动到该子节点,然后继续处理下一个字符。
到达单词末尾时,将你到达的节点标记为 isEndOfWord = true。这个标记用于区分真正存储的单词和仅仅因为是其他内容的前缀而存在的路径。
先插入 "cat",再插入 "car",二者会共享 c -> a 这条路径,只在第三个字符处分支。正是这种共享让字典树在存储字典时非常节省空间。
挑战
简单为 Trie 类添加一个 insert 方法。
它接收一个字符串 word,并将其存储在 trie 中:
- 从
root开始。对于word中的每个字符c,如果当前节点没有对应的子节点,就在那里添加一个新的TrieNode。 - 移到该子节点并继续。
- 处理完最后一个字符后,将最终节点的
isEndOfWord标记为true。
亲手试试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "trie.h"
int main() {
Trie t;
Trie_init(&t);
char line[1024];
while (fgets(line, sizeof(line), stdin)) {
line[strcspn(line, "\r\n")] = '\0';
char* cmd = strtok(line, " \t");
if (!cmd) continue;
if (strcmp(cmd, "rootIsEmpty") == 0) { printf("%s\n", TrieNode_childrenCount(t.root) == 0 ? "true" : "false"); }
if (strcmp(cmd, "hasChild") == 0) { char* arg = strtok(NULL, " \t"); if (arg) printf("%s\n", t.root->children[(unsigned char)arg[0]] != NULL ? "true" : "false"); }
if (strcmp(cmd, "insert") == 0) { char* arg = strtok(NULL, " \t"); if (arg) Trie_insert(&t, arg); }
}
return 0;
}
字典树:数据结构系列第 8 课中的所有课
自己练习: C 在线编译器