字典树模板

#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);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值