您的位置:首页 > 其它

字典树(trie)

2012-11-12 17:02 225 查看
#include<iostream>
#include<vector>
#include<string>
using namespace std;

#define MAXSIZE 10

typedef struct trie
{
char *data;
struct trie *next[26];
trie():data(NULL)
{
for(int k=0;k<26;k++)
next[k]=NULL;
}
}TRIE;

TRIE *trie;

void print(TRIE *root)
{
if(!root) return;
if(root->data!=NULL) cout<<root->data<<endl;
for(int i=0;i<26;i++)
print(root->next[i]);
}

void free_node(TRIE *root)
{
if(root==NULL) return;
for(int i=0;i<26;i++)
{
trie=root->next[i];
free_node(trie);
if(trie!=NULL&&trie->data!=NULL)
{
delete trie->data;
trie=NULL;
}
}
}

void free_trie(TRIE *root)
{
free_node(root);
if(root->data!=NULL) delete root->data;
}

void insert(TRIE * &root,char *str,const char *data)
{
if(!root) return;
TRIE *trie = root;
char *cur=str;
int i;
while(*cur)
{
if(*cur>='A'&&*cur<='Z') i=*cur-'A';
else if(*cur>='a'&&*cur<='z') i=*cur-'a';
if(!trie->next[i])
{
trie->next[i]=new TRIE();
}
cur++;
trie=trie->next[i];
}
trie->data=new char(strlen(data)+1);
strcpy(trie->data,data);
}

int search(TRIE *root,char *str,char *result)
{
char *cur=str;
int i,j;
while(*cur)
{
if(*cur>='A'&&*cur<='Z') i=*cur-'A';
else if(*cur>='a'&&*cur<='z') i=*cur-'a';
if(root->next[i]==NULL)
{
strcpy(result,"");
return 0;
}
cur++;
root=root->next[i];
}
strcpy(result,root->data);
return 1;
}

int main()
{
TRIE *root;
root=new TRIE();
insert(root,"Alexander-china","this is Alexander-china!");
insert(root,"zhang san","this is zhang san!");
insert(root,"li si","this is li si!");
//	print(root);
char result[200];
search(root,"Alexander-china",result);
cout<<result<<endl;
search(root,"zhang san",result);
cout<<result<<endl;
search(root,"li si",result);
cout<<result<<endl;
free_trie(root);
system("pause");
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: