题目链接:http://poj.org/problem?id=2503
题目意思:就是给出一些单词的对应关系,然后输入一些单词,把他们翻译成对应的
单词,如果要查询的单词不存在,输出eh.
字典树模板题目,入门题。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int maxn = 26;
typedef struct TrieNode ///字典树节点定义
{
char str[13]; ///该节点代表的单词。
bool isWord;
struct TrieNode *son[maxn]; ///26个儿子。
}Trie;
void insertWord(Trie *root,char word[],char str[]) ///将单词word插入到字典树
{
Trie *p = root;
int i = 0;
char ch = word[i];
while(ch != '\0')
{
if(p->son[ch-'a'] == NULL)
{
Trie *node = (Trie*)malloc(sizeof(Trie));
for(int i = 0; i < maxn; i++)
{
node->son[i] = NULL;
}
node->isWord = false;
p->son[ch-'a'] = node;
p = p->son[ch-'a'];
}
else
{
p = p->son[ch-'a'];
}
ch = word[++i];
}
p->isWord = true;
strcpy(p->str,str); ///把它所代表的单词赋给当前的节点
}
void findWord(Trie *root,char word[])
{
int i = 0;
char ch = word[i];
Trie *p = root; ///辅助指针p
while(p!=NULL && ch!='\0')
{
p = p->son[ch-'a'];
ch = word[++i];
}
if(p == NULL) printf("eh\n");
else if(p->isWord == false) printf("eh\n");
else printf("%s\n",p->str);
}
///释放字典树
void freeTrie(Trie *root)
{
for(int i = 0; i < maxn; i++)
{
if(root->son[i]!=NULL)
freeTrie(root->son[i]);
}
free(root);
}
int main()
{
Trie *root=(Trie*)malloc(sizeof(Trie));
for(int i = 0; i < maxn; i++)
{
root->son[i] = NULL;
}
char str1[12],str2[12],str[50];
while(gets(str))
{
if(strlen(str)==0)
break;
sscanf(str,"%s %s",str1,str2);
insertWord(root,str2,str1);
}
while(gets(str2))
{
findWord(root,str2);
}
freeTrie(root);
return 0;
}