Tire樹(shù)(也稱為Trie樹(shù))是一種樹(shù)形數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)動(dòng)態(tài)集或關(guān)聯(lián)數(shù)組,其中鍵是序列(通常為字符串)。Tire樹(shù)的節(jié)點(diǎn)存儲(chǔ)與鍵相關(guān)聯(lián)的值以及存儲(chǔ)鍵本身的地方。節(jié)點(diǎn)在樹(shù)中的位置定義了與之相關(guān)聯(lián)的鍵。
tire樹(shù)在日常開(kāi)發(fā)中應(yīng)用也是比較廣泛的
Tire樹(shù)可以用于實(shí)現(xiàn)自動(dòng)補(bǔ)全搜索功能。例如,當(dāng)用戶在搜索框中輸入一個(gè)字符串時(shí),可以使用Tire樹(shù)來(lái)快速查找所有以該字符串為前綴的關(guān)鍵字。這樣,用戶就可以在輸入過(guò)程中看到建議的關(guān)鍵字,并選擇其中之一進(jìn)行搜索。
這是一個(gè)使用Go實(shí)現(xiàn)Tire樹(shù)的示例:
package main
import "fmt"
const alphabetSize = 26
// TrieNode表示Trie樹(shù)中的一個(gè)節(jié)點(diǎn)。
type TrieNode struct {
children [alphabetSize]*TrieNode
isEnd bool
}
// Trie是一個(gè)Trie樹(shù)。
type Trie struct {
root *TrieNode
}
// Insert將鍵插入Trie中。
func (t *Trie) Insert(key string) {
node := t.root
for i := 0; i < len(key); i++ {
index := key[i] - 'a'
if node.children[index] == nil {
node.children[index] = &TrieNode{}
}
node = node.children[index]
}
node.isEnd = true
}
// Search在Trie中搜索鍵,如果存在則返回true,否則返回false。
func (t *Trie) Search(key string) bool {
node := t.root
for i := 0; i < len(key); i++ {
index := key[i] - 'a'
if node.children[index] == nil {
return false
}
node = node.children[index]
}
return node.isEnd
}
func (t *Trie) Print() {
printUtil(t.root, "", 0)
}
func printUtil(node *TrieNode, str string, level int) {
if node == nil {
return
}
if node.isEnd {
fmt.Println(str)
}
if isLeafNode(node) {
return
}
for i := 0; i < alphabetSize; i++ {
c := i + 'a'
printUtil(node.children[i], str+string(c), level+1)
}
}
func isLeafNode(node *TrieNode) bool {
for i := 0; i < alphabetSize; i++ {
if node.children[i] != nil {
return false
}
}
return true
}
func main() {
trie := Trie{root: &TrieNode{}}
trie.Insert("hello")
trie.Insert("world")
fmt.Println(trie.Search("hello"))
fmt.Println(trie.Search("world"))
fmt.Println(trie.Search("hell"))
fmt.Println(trie.Search("worl"))
trie.Print()
}