#include <iostream>
#include <cstdlib>
#include <stdio.h>
#define MAX 26
using namespace std;
typedef struct TrieNode{
bool isStr;//标记该节点处是否构成单词
struct TrieNode* next[MAX];//孩子分支
}Trie;
void insert(Trie *root, const char* s)//将单词s插入到Trie中
{
if(root==NULL || *s=='\0')
return;
int i;
Trie *p=root;
while(*s!='\0')
{
if(p->next[*s-'a']==NULL)//如果不存在则建立节点
{
Trie* temp=new Trie;
for(i=0; i<MAX; i++)
{
temp->next[i]=NULL;
}
temp->isStr=false;
p->next[*s-'a']=temp;
p=p->next[*s-'a'];
}
else
{
p=p->next[*s-'a'];
}
}
p->isStr=true; //单词结束的地方标记此处可以构成一个单词
}
int search(Trie *root, const char* s) //查找某个单词是否已经存在
{
Trie *p=root;
while(p!=NULL && *s!='\0')
{
p=p->next[*s-'a'];
s++;
}
return (p!=NULL && p->isStr==true);//在单词结束处的标记为true时,单词才存在
}
void del(Trie *root)
{
int i;
for(i=0; i<MAX; i++)
{
del(root->next[i]);
}
delete root;
}
int main(int argc, char* argv[])
{
int i;
int n, m;
char s[100];
Trie* root=new Trie;
for(i=0; i<MAX; i++)
root->next[i]=NULL;
root->isStr=false;
cin>>n;
for(i=0; i<n; i++)
{
cin>>s;
insert(root, s);
}
while(scanf("%d",&m)!=EOF)
{
for(i=0; i<m; i++)
{
cin>>s;
if(search(root, s)==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
del(root);
return 0;
}
Trie树的基本操作
最新推荐文章于 2019-06-25 22:01:09 发布