#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
int nCount;
char *str;
struct node *pCharacter[26];
}TrieTree;
TrieTree *GetNode()
{
TrieTree *pTemp = NULL;
pTemp = (TrieTree*)malloc(sizeof(TrieTree));
memset(pTemp,0,sizeof(TrieTree));
return pTemp;
}
void AddWord(TrieTree *pTree,char *str)
{
int i=0;
while(i < strlen(str))
{
//检测是否有对应字符串开头的单词
if(pTree->pCharacter[str[i]-97] == NULL)
{
pTree->pCharacter[str[i]-97] = GetNode();
}
//下一个
pTree = pTree->pCharacter[str[i]-97];
i++;
}
//末尾标记
pTree->nCount++;
pTree->str = str;
}
TrieTree *CreateTrieTree(char *strarr[],int nLength)
{
if(strarr == NULL || nLength <= 0)return NULL;
//根节点
TrieTree *pRoot = NULL;
pRoot = GetNode();
//单词添加
int i;
for(i=0;i<nLength;i++)
{
AddWord(pRoot,strarr[i]);
}
return pRoot;
}
//遍历字典树
void PreorderTraversal(TrieTree *pTree)
{
if(pTree = NULL) return;
//有单词的节点打印
if(pTree->nCount > 0)
{
printf("%s\n",pTree->str);
}
//依次处理各个子树
int i;
for(i=0;i<26;i++)
{
PreorderTraversal(pTree->pCharacter[i]);
}
}
void Search(TrieTree *pTree,char *str)
{
if(pTree == NULL || str == NULL)return;
int i=0;
while(i<strlen(str))
{
//没有以当前字符开始的字符串
if(pTree->pCharacter[str[i]-97] == NULL)
{
printf("Failed TAT.\n");
return;
}
//下一个
pTree = pTree->pCharacter[str[i]-97];
i++;
}
//检测末尾标志
if(pTree->nCount != 0)
{
printf("Success:%s\n",pTree->str);
}
else
{
printf("Failed QAQ.\n");
}
}
int main()
{
TrieTree *pRoot = NULL;
char *strarr[] = {"sea","apple","kfc","vme","detrimental"};
pRoot = CreateTrieTree(strarr,3);
PreorderTraversal(pRoot);
Search(pRoot,"kfc");
return 0;
}