标签:c++
<span style="font-family: Arial, Helvetica, sans-serif;">#include <bits/stdc++.h></span>
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; 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); } };
标签:c++
原文地址:http://blog.csdn.net/calamity_coming/article/details/45330911