由于trie树中trie[rt][x]这个数组表示的含义是结点为rt的子树的第x个孩子的编号,我们发现trie树这个数据结构天生适合字符串排序。
具体一点,就是某个结点的孩子会按字母序排列好(若这个孩子不存在只需要多加一句判断if(trie[rt][x]))。
我们可以用dfs的方法对trie树这个数据结构来实现字符串排序(字母序)。
code:
#include<bits/stdc++.h> //用trie树实现字符串排序 using namespace std; const int N = 100005; int n,cnt; int trie[N][29]; char s[N]; int ans[N]; bool en[N]; void insert(char *s,int rt){ for(int i=0;i<strlen(s);i++){ int x=s[i]-'a'; if(!trie[rt][x]) trie[rt][x]=++cnt; if(i==strlen(s)-1){ en[trie[rt][x]]=1; } rt=trie[rt][x]; } } void print(int n){ for(int i=1;i<=n;i++){ printf("%c",ans[i]+'a'); } puts(""); } void dfs(int cnt,int rt,int ch){ ans[cnt]=ch; if(en[rt]==1){ print(cnt); return; } for(int i=0;i<26;i++){ if(trie[rt][i]){ dfs(cnt+1,trie[rt][i],i); } } } int main(){ memset(en,0,sizeof(en)); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s); insert(s,0); } dfs(0,0,0); return 0; }