闲着没事,把以前写的字典树搬过来,贴一下。
深搜遍历那块个人觉得没有写太好,因为其余都是用char *实现的,那部分却用了string.
char*的速度是比string快很多的,所以还有待改进。所有代码均属个人编写,没有经过专门
测试,所以暂时还不知道正确性,如果有问题,还请指正。
#include<iostream>
#include<string>
using namespace std;
struct trie_node
{
trie_node()
{
is_word = false;
for(int i = 0;i<26;i++)
{
node[i] = NULL;
}
}
bool is_word ; // 根到该节点是否对应一个字符串
trie_node *node[26];
};
class Trie
{
public:
trie_node *root; //根节点
Trie(){root = NULL;}
bool trie_search(const char *str) //查找
{
trie_node *temp = root;
for(int i = 0;i<strlen(str);i++)
{
if(temp->node[str[i]-'a'] == NULL)
return false;
temp = temp->node[str[i]-'a'];
}
return temp->is_word;
};
void trie_insert(const char *str) //插入
{
if(root == NULL)
root = new trie_node;
trie_node *temp = root;
for(int i = 0;i<strlen(str);i++)
{
int site = str[i] - 'a';
if(temp->node[site] == NULL)
{
temp->node[site] = new trie_node;
temp = temp->node[site];
}
else
temp = temp->node[site];
}
temp->is_word = true;
};
bool trie_del(const char *str) //删除
{
trie_node *temp = root;
for(int i = 0;i<strlen(str);i++)
{
if(temp->node[str[i]-'a'] == NULL)
return false;
temp = temp->node[str[i]-'a'];
}
if(temp->is_word)
temp->is_word = false;
else
return false;
return true;
}
};
void print(trie_node *root,string str)
{
for(int i = 0;i<26;i++)
{
if(root->node[i] != NULL)
{
trie_node *temp = root;
root = root->node[i];
str += i+'a';
if(root->is_word)
{
cout<<str<<endl;
}
print(root,str);
str.erase(str.size()-1,1); //删除最后一个元素
root = temp;
}
}
}
int main()
{
char s[11];
int n;
string str2 ;
printf("1.插入/n");
printf("2.查找/n");
printf("3.删除/n");
printf("4.深度遍历/n");
Trie x;
while(scanf("%d",&n)!=EOF)
{
switch(n)
{
case 1:
scanf("%s",&s);
x.trie_insert(s);
printf("insert succeed/n");
break;
case 2:
scanf("%s",&s);
if(x.trie_search(s))
printf("yes/n");
else
printf("no/n");
break;
case 3:
scanf("%s",&s);
if(x.trie_del(s))
printf("yes/n");
else
printf("no/n");
break;
case 4:
str2 = "";
print(x.root,str2);
break;
default:
;
}
printf("1.插入/n");
printf("2.查找/n");
printf("3.删除/n");
printf("4.深度遍历/n");
}
return 0;
}