字典樹的入門

2021-08-19 03:02:26 字數 2025 閱讀 3275

所謂字典樹,就是將一些單詞利用樹狀圖儲存起來,然後可以進行一些快速的查詢等功能

從根節點到某乙個節點,路徑上經過的字元連線起來,為該節點對應的字串。

每個節點的所有子節點包含的字元互不相同。

這樣的儲存方式簡單又快捷,而且時間複雜度大大降低。

那麼,我們怎樣來建立這樣的乙個字典樹呢?別急,我們慢慢來

首先,我們要建立乙個結構體:

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 字典樹...