码迷,mamicode.com
首页 > 其他好文 > 详细

字典树模板

时间:2015-04-28 09:39:59      阅读:129      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!