trie樹
,是一種
樹形結構
,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串
(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。
首先trie樹的根必定是乙個空節點,每一條邊代表了乙個字元,每乙個節點有多種可能,那麼我們可以使用乙個陣列來達到這個目的;
同時,每乙個單詞(字串)的最後乙個字元所指向的節點需要做標記(如上圖的紅色節點),以表示從樹根到現在所遍歷的乙個字串;
那麼上面所說的就可以通過乙個結構體來實現。
int num = 26; //以26個小寫字母為例
struct trienode
;
然後這個trie就需要插入字串,刪除節點,以及查詢字串,當然,插入字串的函式或者搜尋字串也可以用來刪除某一字串;插入字串,從根節點開始,依次遍歷字串中的每乙個字元,同時也建立新的節點,以達到插入的目的,下面是**的實現:
void insert(trienode* root,const char* word)
now = now->next[*word-'a'];
word++;
} now->istri = true;
}
搜尋字串,也是從根節點開始,依次遍歷,直到樹的最深處或者到達字串的最後乙個字元為止,在這個時候就可以如果到達數的最深處的時候字串仍然沒有遍歷完,或者遍歷完最後乙個字元的時候這個加點未被標記,那麼我們就可以返回false的資訊,表示沒有搜尋到;反之,如果遍歷字串結束之後並且此時的節點被標記(儲存過該字串),則返回true的資訊,當然搜尋這裡還有部分的應用,這裡就不說了。
bool search(trienode* root,const char* word)
} return (now->istri&&now!=null);
}
刪除節點,就是使用遞迴的方式刪除節點,從某一節點開始,依次遍歷其所有節點,又繼續刪除;
void delete(trienode* node)
} delete node;
}
完整**:
#include#include#include#includeusing namespace std;
const int num = 26;
struct trienode
void insert(trienode* root,const char* word)
now = *newnode;
word++;
} now->istri = true;
}bool search(trienode* root,const char* word)
} return (now->istri&&now!=null);
}void delete(trienode* node)
} delete node;
}int main()
字典樹(Trie樹)模板
結構 struct node head 生成節點 動態分配記憶體 node newnode 靜態分配記憶體 node t 1000000 int t 0 node newnode 注意 1 在此之前head一定要先分配,否則無法執行,這裡自己老是出錯。2 還有如果處理多組資料的話一定要注意清空t陣列...
Trie字典樹 模板整理
首先附上學習字典樹參考的部落格鏈結 字典樹,又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字元 串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊...
trie字典樹 模板題
字典樹是一種實現字串快速檢索的多叉樹結構。每個節點都擁有很多個指標。1 include 2 include 3 using namespace std 4 5 const int n 1e6 5,m 5e5 5 6 7 int trie m 26 tot 0,cnt m 陣列模擬樹,8 cnt i ...