package main
import (
"fmt"
)
type TrieNode struct {
Child map[interface{}]*TrieNode
IsEnd bool
}
func NewTrieNode()*TrieNode{
return &TrieNode{Child:make(map[interface{}]*TrieNode),IsEnd:false}
}
type Trie struct {
Root *TrieNode
}
func NewTrie()*Trie{
return &Trie{Root:NewTrieNode()}
}
func (t *Trie) Insert(str []interface{}) {
root := t.Root
for i := 0; i < len(str); i++{
_, ok := root.Child[str[i]]
if !ok {
root.Child[str[i]] = NewTrieNode()
}
root = root.Child[str[i]]
}
root.IsEnd = true
}
func (t *Trie) Match(str []interface{})bool{
root := t.Root
for i := 0; i < len(str); i++{
_, ok := root.Child[str[i]]
if !ok {
return false
} else {
root = root.Child[str[i]]
}
}
return root.IsEnd
}
func (t *Trie) MatchPrefix(prefix []interface{})bool{
root := t.Root
for i := 0; i < len(prefix); i++{
_, ok := root.Child[prefix[i]]
if !ok {
return false
} else {
root = root.Child[prefix[i]]
}
}
return true
}
//遍历树
func (t *Trie) Traverse(){
root := t.Root
traverse(root)
}
func traverse(root *TrieNode){
if root == nil {
return
}
for i := range root.Child{
fmt.Printf("%c", i)
fmt.Println()
}
for _, v := range root.Child {
traverse(v)
}
}
func main(){
trie := NewTrie()
str := []interface{}{'a','b','c'}
str1 := []interface{}{'a','b','d','e'}
str2 := []interface{}{'b','c','f','g'}
str3 := []interface{}{'c','f','g'}
//str4 := []interface{}{'a','b'}
trie.Insert(str)
trie.Insert(str1)
trie.Insert(str2)
trie.Insert(str3)
//fmt.Println(trie.Match(str4))
//fmt.Println(trie.MatchPrefix(str4))
trie.Traverse()
fmt.Println()
}
字典树
最新推荐文章于 2024-02-08 20:21:57 发布