TRIE树,即字典树,可以用于排序、保存大量字符串,在搜索引擎和防火墙中都有着重要的作用。本文使用字典树读取汉语拼音并进行匹配,成功实现了汉语拼音的划分。
先来看看TRIE树的结构:
树从root根节点出发,每个节点都有26个子节点(对应各个字母)。不难发现所有n长度的单词组合都在高度为n的TRIE树中。我们把从root节点出发,到某叶子(或节点)的字母组合称为一个单词。
1.定义以下结构体构造TRIE树:
typedef struct TRIE_NODE_ {
struct TRIE_NODE_ *children[26];
bool is_word;
} TRIE_NODE;
和我们料想的一样,每个节点都有26个子节点,还有一个标记用于表示root节点到该处是不是一个单词。
2.初始化TRIE树:
static TRIE_NODE* TrieAllocateNode() {
TRIE_NODE *ret = (TRIE_NODE*) malloc(sizeof(TRIE_NODE));
if (!ret) exit(1);
ret->is_word = false;
memset(ret->children, 0, 26 * sizeof(TRIE_NODE*));
return ret;
}
通用的树的新节点的建立方法,注意将节点属性初始化为false,并把子节点清空。
3.添加新的单词到树中
void TrieAdd(TRIE_NODE *root, char *text) {
for (; *text != '\0'; ++text) { //C中遍历字符串的通用做法
if (root->children[(*text) - 'a'] == NULL) {
root->children[(*text) - 'a'] = TrieAllocateNode(); //把字母直接减去A的ASCLL码值,可以将字母与26个子节点一一对应。
}
root = root->children[(*text) - 'a']; //转向下一层树
}
root->is_word = true; //将该单词标为true
}
4.利用深度优先搜索(dfs&