因为需要学一下字典树,所以看了博客 字典树介绍
但是因为要做一个字典树的排序,那么想来想去实际上就是对于已经建好的字典树按照字典顺序来输出,所以加了一个全局字符串变量ans来存储当前遍历得到的单词,并且写了一个递归函数display用来将单词输出
#include<stdio.h>
#include<string.h>
const int MAX_NODE = 100000 + 10;
const int CHARSET = 26;
int trie[MAX_NODE][CHARSET] = {0};
int color[MAX_NODE] = {0};
int k = 1;
char ans[55];
void insert(char *w){
int len = strlen(w);
int p = 0;
for(int i=0; i<len; i++){
int c = w[i] - 'a';
if(!trie[p][c]){
trie[p][c] = k;
k++;
}
p = trie[p][c];
}
color[p] = 1;
}
int search(char *s){
int len = strlen(s);
int p = 0;
for(int i=0; i<len; i++){
int c = s[i] - 'a';
if(!trie[p][c]) return 0;
p = trie[p][c];
}
return color[p] == 1;
}
void display(int p, int n){
if (color[p]) {
ans[n] = '\0';
printf("%s\n", ans);
return;
}
for (int i = 0; i < 26; ++i) {
if (trie[p][i]) {
ans[n] = 'a' + i;
display(trie[p][i], n+1);
}
}
}
int main(){
int t,q;
char s[50];
// scanf("%d%d", &t,&q);
// while(t--){
// scanf("%s", s);
// insert(s);
// }
// while(q--){
// scanf("%s", s);
// if(search(s)) printf("YES\n");
// else printf("NO\n");
// }
while (scanf("%s", s) != EOF) {
insert(s);
}
for (int i = 0; i < 26; ++i) {
if (trie[0][i]) {
ans[0] = 'a' + i;
display(trie[0][i], 1);
}
}
return 0;
}
/*
there are two
*/