辞書ツリー(Trieツリー)C++実装
2382 ワード
説明:
以下のコードは個人が自分の理解に従って書いたもので、間違いやあまり規範的ではないところがあるかもしれません.ご指摘ください.
コードは次のとおりです.
以下のコードは個人が自分の理解に従って書いたもので、間違いやあまり規範的ではないところがあるかもしれません.ご指摘ください.
コードは次のとおりです.
// 、 、 、
// : ,T , 。
#include
using namespace std;
typedef long long LL;
const double eps = 1e-6;
const int INF = 2e9;
const LL LNF = 9e18;
const int mod = 1e9+7;
const int maxn = 100+10;
typedef struct node
{
bool exist; //
int cnt; // ,
struct node *next[26];
void init()
{
exist = cnt = 0;
memset(next,0,sizeof(0));
}
}Node, *Tree;
void insert(Tree &T, char *s, int k)
{
if(!T)
{
T = new Node;
T->init();
}
if(!s[k]) //
{
T->exist = true; //
}
else
{
T->cnt++; //
insert(T->next[s[k]-'a'], s, k+1);
}
}
char ans[100]; //
void traverse(Tree T, int k) // ,
{
if(T->exist) // ,
{
ans[k] = 0;
cout<next[i])
{
ans[k] = i+'a';
traverse(T->next[i], k+1);
}
}
}
int search(Tree T, char *s, int k)
{
if(!T) return 0; // ,
if(!s[k]) // ,
{
return T->exist;
}
else //
{
return search(T->next[s[k]-'a'], s, k+1);
}
}
bool del(Tree &T, char *s, int k)
{
if(!T) return 0;
if(!s[k])
{
if(T->cnt) // ,
{
T->exist = 0;
}
else // ,
{
delete T;
T = NULL;
}
return 1;
}
else
{
if(del(T->next[s[k]-'a'], s, k+1))
{
T->cnt--;
if(!T->exist && !T->cnt) // , ,
{
delete T;
T = NULL;
}
return 1;
}
return 0;
}
}
int main()
{
Tree T;
T = new Node;
T->init();
int n;
cin>>n;
char s[100];
for(int i = 1; i<=n; i++)
{
cin>>s;
insert(T,s,0);
}
traverse(T,0);
cin>>s;
del(T,s,0);
traverse(T,0);
cin>>s;
cout<< search(T,s,0) <