c语言实现遍历trie树生成单词字典序,用数组,不用链表
时间: 2024-03-13 08:17:45 浏览: 115
Trie树是一种用于高效存储和检索字符串数据集的树形数据结构。在实现Trie树的过程中,我们需要使用一个数组来存储节点信息,而不是链表。
以下是C语言实现遍历Trie树生成单词字典序的示例代码,其中使用了数组来存储节点信息:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ALPHABET_SIZE 26
// Trie树节点结构体
struct TrieNode {
struct TrieNode *children[ALPHABET_SIZE];
int isEndOfWord;
};
// 创建Trie树节点
struct TrieNode *createNode() {
struct TrieNode *node = (struct TrieNode *)malloc(sizeof(struct TrieNode));
node->isEndOfWord = 0;
for (int i = 0; i < ALPHABET_SIZE; i++) {
node->children[i] = NULL;
}
return node;
}
// 插入单词到Trie树
void insert(struct TrieNode *root, char *word) {
struct TrieNode *node = root;
int len = strlen(word);
for (int i = 0; i < len; i++) {
int index = word[i] - 'a';
if (!node->children[index]) {
node->children[index] = createNode();
}
node = node->children[index];
}
node->isEndOfWord = 1;
}
// 遍历Trie树并生成单词字典序
void traverse(struct TrieNode *node, char *word, int level) {
if (node->isEndOfWord) {
word[level] = '\0';
printf("%s\n", word);
}
for (int i = 0; i < ALPHABET_SIZE; i++) {
if (node->children[i]) {
word[level] = i + 'a';
traverse(node->children[i], word, level + 1);
}
}
}
int main() {
char *words[] = {"hello", "world", "he", "hi", "there", "their", "they", "them"};
int n = sizeof(words) / sizeof(words[0]);
// 创建Trie树并插入单词
struct TrieNode *root = createNode();
for (int i = 0; i < n; i++) {
insert(root, words[i]);
}
// 遍历Trie树并生成单词字典序
char word[100];
traverse(root, word, 0);
return 0;
}
```
上述代码中,我们首先定义了一个Trie树节点结构体,其中包含一个指向子节点的指针数组和一个表示当前节点是否为单词结尾的标志位。然后,我们定义了几个函数来创建节点、插入单词以及遍历Trie树并生成单词字典序。
在`main`函数中,我们首先定义了一个字符串数组来存储要插入Trie树的单词。然后,我们创建了一个Trie树并依次插入这些单词。最后,我们调用了`traverse`函数来遍历Trie树并生成单词字典序。在遍历的过程中,我们使用一个字符数组`word`来存储当前遍历到的单词,`level`表示当前遍历到的层数(即单词的长度)。如果当前节点为单词结尾,我们就将`word`数组中的字符打印出来。最后,我们递归遍历当前节点的所有子节点,并将当前节点的字符加入`word`数组中,继续向下遍历。
需要注意的是,如果要生成单词字典序,我们需要在遍历Trie树时按照字典序的顺序遍历子节点,即先遍历a、b、c……等字母节点,再遍历下一个节点。
阅读全文