#include <bits/stdc++.h>
using namespace std;
const int MA=10;
const char MU='0';
struct dian
{
int sum;
dian *next[MA];
dian()//构造函数
{
sum=0;
for(int i=0;i<MA;++i)
next[i]=NULL;
}
};
class tree
{
dian *tou;
void dfs(dian *p,int n,vector<string> &jb,char *s)//先序遍历,按字典序排序,结果存在vector中
{
if(p->sum)
{
s[n]='\0';
string sb=s;
for(int i=0;i<p->sum;++i)//去掉这个循环可去重
jb.push_back(sb);
}//这里没有rerurn因为可能是以让为前缀的字串
for(int i=0;i<MA;++i)
{
if(p->next[i]!=NULL)
{
s[n]=i+MU;
dfs(p->next[i],n+1,jb,s);
s[n]='\0';
}
}
}
bool des(const string &s,int k,int n,dian *p)//1表示根节点上有其他值0表示空可删该点
{
if(k==n)
{
p->sum=0;
for(int i=0;i<MA;++i)
if(p->next[i]!=NULL)
return true;
delete p;
return false;
}
int q=s[k]-MU;
if(p->next[q]==NULL)//这个是如果没有这个点就返回
return false;
if(des(s,k+1,n,p->next[q]))
return true;
p->next[q]=NULL;
if(p->sum)
return true;
for(int i=0;i<MA;++i)
if(p->next[i]!=NULL)
return true;
delete p;
return false;
}
void clear(dian *p)//清空,后序遍历
{
if(p==NULL) return;
for(int i=0;i<MA;++i) if(p->next[i]!=NULL) clear(p->next[i]);
delete p;
}
public:
tree()//构造
{
tou=new dian;
}
void insert(const string &s)//插入操作
{
dian *p=tou;
for(int i=0,n=s.size();i<n;++i)
{
int adc=s[i]-MU;
if(p->next[adc]==NULL)
p->next[adc]=new dian;
p=p->next[adc];
}
++(p->sum);
}
void xianxu(vector<string> &jb)//外部传参数的位置
{
char s[100];
dfs(tou,0,jb,s);
}
bool fand(const string &s)//查找s存在,改成Int可以返回他的个数
{
dian *p=tou;
for(int i=0,n=s.size();i<n;++i)
{
int adc=s[i]-MU;
if(p->next[adc]==NULL)
return false;
p=p->next[adc];
}
if(p->sum)
return true;
return false;
}
~tree()//析构清空
{
clear(tou);
}
void del(const string &s)//删除传参位置
{
int n=s.size();
des(s,0,n,tou);
}
};
字典树模板
最新推荐文章于 2024-03-14 23:38:31 发布