所謂字典樹,就是將一些單詞利用樹狀圖儲存起來,然後可以進行一些快速的查詢等功能
從根節點到某乙個節點,路徑上經過的字元連線起來,為該節點對應的字串。
每個節點的所有子節點包含的字元互不相同。
這樣的儲存方式簡單又快捷,而且時間複雜度大大降低。
那麼,我們怎樣來建立這樣的乙個字典樹呢?別急,我們慢慢來
首先,我們要建立乙個結構體:
typedef struct trie_node
*trie;
這個結構體裡面的count表示在此結點的單詞出現的次數(等下你就會知道),而下面那個
trie_node *children[tree_size];
表示這個結點連線下面的是哪乙個字母,因為一共有26個字母,所以我們設定tree_size為26
下面我們要開始建立字典樹了:
trie_node *creat_trie_node()
我們來解析一下,我們首先建立了乙個結構體指標pnode,令他的count為0,然後利用乙個迴圈將這個結點指向的26個字母都為null,然後返回這個指標變數,這個指標變數就是下面的root
那麼,我們要開始把乙個個單詞插入進去了
void trie_insert(trie_node *root, char *key)
node = node->children[*p - 'a'];
p++;
} node->count += 1;
}
這裡的node->children[*p - 'a']
意思就是跟結點指向的這個字母有沒有出現過,出現過就把這個指標指向當前節點,然後將node
向下移,p++進行這個單詞往後數,最後count+1表示這個單詞出現過一次了
然後我們要怎樣檢查乙個單詞有沒有出現過呢?
int trie_search(trie_node *root, char *key)
if (node == null)
return 0;
else
return node->count;
}
*key指向單詞,我們沿著建立後的樹由root開始尋找,乙個個往下,直到查詢完了,那麼返回count,如果沒有這個單詞就會返回0,所以下面如果判斷乙個單詞是否出現過,那麼就只要判斷返回的數字是否大於零就行。
接下來來一題題目做做
這道題有時間限制,那麼我們學會了字典樹以後就能夠很輕鬆的把它解出來了
#include#includeusing namespace std;
const int tree_size = 26;
typedef struct trie_node
*trie;
trie_node *creat_trie_node()
void trie_insert(trie_node *root, char *key)
node = node->children[*p - 'a'];
p++;
} node->count += 1;
}int trie_search(trie_node *root, char *key)
if (node == null)
return 0;
else
return node->count;
}int main()
ans =ch;
} cout << ans << endl;
system("pause");
return 0;
}
大家可以找一些題目來練練手,然後總結一下經驗。。。 字典樹入門
字典樹終於稍微勉強地入了門。推薦部落格題目 練習題 講一下藍書的乙個例題 remember the word la3942 建議白天去牛客提交 題意 給你n個單詞,再給你乙個字元長串,問你有多少種分解方案。dp 字典樹 設dp i 表示 i n 內字串的分解方案數 相當於乙個字尾 我們列舉 n 1 ...
字典樹入門
今天先寫了01字典樹,學習部落格 這個01字典樹還是很簡單的,看看模板就會了 貼一下我的模板 const int maxn 1e5 10 int n,m,tot int trie 32 maxn 2 num maxn ll val maxn 32 void init void insert ll x...
字典樹入門
推薦部落格 之所以稱其為字典樹,是因為它在使用的過程中就是乙個類似查字典的過程,我們從第乙個字母乙個乙個的往下面去找 關於字典樹的寫法有兩種,一種是用鍊錶的形式去寫,比較好懂,還有一種就是用陣列的形式去寫,通過結點的編號實現相連的過程。int ch 200010 27 節點編號 int sz 字典樹...