字典樹的創建和基本查找

字典樹的創建和基本查找

一.字典樹的定義

字典樹又叫作前綴樹,任意一個或多個字符串能夠構建一棵字典樹用於存儲多個串的公共前綴ios

二.構建字典樹的兩種方法

(1)字典樹的鏈表構建及查找

在用鏈表構造的字典樹中每個節點有着一個數據域來存放該點表明的字符和26個指針分別指向a(A)~z(Z)26個可能出現的子字符,在尋找某個字符串是否出現時,從根節點出發不斷向下查找配對,若是到了最後一個字符都存在則表示該前綴存在數組

(2)字典樹的二維數組構建及查找

用二維數組tree[i][j]來標識一顆字典樹,其中i爲父節點,j爲子節點,程序開始時父節點爲root節點。tree[i][j]表示節點i第j個兒子的編號【這裏咱們規定root的編號爲0】函數

1) 字典樹的二維數組構建

2)字典樹的二維數組查找

三.代碼模板

(1) 字典樹的鏈表模板

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4  
 5 const int SIZE=10; 
 6 struct Trie
 7 {
 8     int count;//前綴出現的次數
 9     struct Trie *next[SIZE];//孩子節點的數目 
10     bool isEnd; //判斷到這個位置是不是一個單詞
11     string name; 
12     Trie()//構造函數 
13     {
14         count=0;
15         memset(next,0,sizeof(next));
16         isEnd=false;
17     } 
18 };  
19 struct Trie *root=new Trie;//創建根節點
20 void Insert(string s)
21 {
22     int len=s.length();
23     int pos;
24     struct Trie *u=root;
25     for(int i=0;i<len;i++)
26     {
27         pos=s[i]-'0';
28         if(u->next[pos]==NULL)//數字在邊上,或者說是以位置的方式體現,不須要存儲 
29             u->next[pos]=new Trie;
30         u=u->next[pos];
31         u->count++;        
32     }
33     u->isEnd=true;//代表爲一個單詞的節點
34     u->name=s;//同時存儲單詞 
35 } 
36 int Search(string s)
37 {
38     struct Trie *u=root;
39     int len=s.length();
40     for(int i=0;i<len;i++)
41     {
42         int pos=s[i]-'0';
43         if(u->next[pos]==NULL)
44             return 0;
45         else
46             u=u->next[pos];
47     }
48     return u->count;
49 } 
50 void del(struct Trie *u)
51 {
52     for(int i=0;i<SIZE;i++)
53     {
54         if(u->next[i]!=NULL)
55             del(u->next[i]);
56     }
57     delete(u);
58 }
59 void print(struct Trie *u)
60 {
61     if(u->isEnd)
62         cout<<u->name<<":"<<u->count<<endl;
63     for(int i=0;i<SIZE;i++)
64         if(u->next[i]!=NULL)
65             print(u->next[i]); 
66 }
67  
68 int main()
69 {
70     int n;
71     string s;
72     cin>>n;
73     while(n--)
74     {
75         cin>>s;
76         Insert(s);
77     }
78     print(root);//打印檢查下 
79     del(root);//釋放樹,下次從新創建 
80     return 0;
81 } 

 

(2) 字典樹的二維數組模板

 

 1 const int maxn =2e6+5;//若是是64MB能夠開到2e6+5,儘可能開大
 2 int tree[maxn][30];//tree[i][j]表示節點i的第j個兒子的節點編號
 3 bool flagg[maxn];//表示以該節點結尾是一個單詞
 4 int tot;//總節點數
 5 void insert_(char *str)
 6 {
 7    int  len=strlen(str);
 8    int root=0;
 9    for(int i=0;i<len;i++)
10    {
11        int id=str[i]-'0';
12        if(!tree[root][id]) tree[root][id]=++tot;
13        root=tree[root][id];
14    }
15    flagg[root]=true;
16 }
17 bool find_(char *str)//查詢操做,按具體要求改動
18 {
19     int len=strlen(str);
20     int root=0;
21     for(int i=0;i<len;i++)
22     {
23         int id=str[i]-'0';
24         if(!tree[root][id]) return false;
25         root=tree[root][id];
26     }
27     return true;
28 }
29 void init()//最後清空,節省時間
30 {
31     for(int i=0;i<=tot;i++)
32     {
33        flagg[i]=false;
34        for(int j=0;j<10;j++)
35            tree[i][j]=0;
36     }
37    tot=0;
38 }
相關文章
相關標籤/搜索