字典樹(數組版)入門級詳細講解加模擬

字典樹是一種用於快速檢索的多叉樹結構,每個節點保存一個字符,一條枝幹表示一個單詞、電話等等信息。

具體每個節點如草圖所示

NULL

 結構體(節點)定義如下

struct Tree
{
    int point[30];
    int num;///這裏維護的是單詞前綴出現多少次,根據自己的需求定義結構體裏面維護的值
    void init()
    {
        for(int i=0; i<=26; i++)
           point[i]=-1;
             num=0;
    }
} T[maxn];

每個節點下面的26條分支初始狀態都是-1  按順序0-25分別表示a到z字符。不是-1的位置代表這個位置可以繼續往下索引。

比如 :(T[0]表示根節點)

T[0].point[0]=1;
T[1].point[1]=2;
T[2].point[2]=3;

這三個數組的意思就是表示存了一個abc字符串,如果T[2].point[0]=4;就表示還存了一個aba的串。從根開始通過T[0].point[0]可以找到T[1],通過T[1]裏面point數組第二個位置的值(索引)可以找到T[2],T[2]的piont數組裏面有第0個和第2個位置不爲-1就表示有了aba和abc字符串。

另貼上三個常用函數

void Insert(char *str,int value)
{
    int cnt=0;///每次從根節點出發
    int len=strlen(str);
    for(int i=0; i<len; i++)
    {
        int x=str[i]-'a';
        if(!T[cnt].point[x])///如果下一個節點不存在就開一個新的節點,並且將當前節點的point指向下一個節點的下標cur
        {
            T[cur].init();
           
            T[cnt].point[x]=cur++;///cur代表字符數組開了多少了,因爲不能重複一直自增
        }
        cnt=T[cnt].point[x];///意思是T=T->next 往下索引
        T[cnt].num+=value; ///維護前綴出現的次數
    }
}
void Delete(char *str,int value)
{
    int x,cnt=0;
    int len=strlen(str);
    for(int i=0; i<len; i++)
    {
        x=str[i]-'a';
        cnt=T[cnt].point[x];
        T[cnt].num-=value;
    }
}
int Query(char *str)
{
    int x,cnt=0;
    int len=strlen(str);
    for(int i=len-1; i>=0; i--)
    {
        x=str[i]-'a';
        if(T[cnt].point[x]==-1)
            return 0;
        cnt=T[cnt].point[x];
    }
    return T[cnt].num;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章