代码拉取完成,页面将自动刷新
// Trie字典树 https://blog.csdn.net/rxbook/article/details/130983299
package main
import (
"fmt"
)
// Trie树结构体
type TrieNode struct {
Data byte //存储字符数据
Next map[byte]*TrieNode //下一个节点指针
IsEnd bool //是否到达叶子结点
}
// Trie树根节点
type TrieRoot struct {
Len int //字符个数
Node map[byte]*TrieNode
}
// 初始化一个Trie树,并给根节点赋值
func NewTire() TrieRoot {
tRoot := TrieRoot{
Len: 0,
Node: make(map[byte]*TrieNode),
}
return tRoot
}
// 插入字符
func (tn *TrieRoot) insert(str string) {
cur := tn.Node
//循环遍历单词的每个字符
for i := 0; i < len(str); i++ {
if cur[str[i]] == nil {
newNode := &TrieNode{
Data: str[i],
Next: make(map[byte]*TrieNode),
IsEnd: false,
}
cur[str[i]] = newNode
}
//判断是否到达叶子结点
if i == len(str)-1 {
cur[str[i]].IsEnd = true
}
cur = cur[str[i]].Next
}
tn.Len++
}
// 查找字符
func (tn *TrieRoot) find(str string) bool {
if tn.Node == nil {
return false
}
cur := tn.Node
//循环遍历单词的每个字符
for i := 0; i < len(str); i++ {
//如果某个字符不存在,直接返回false
if cur[str[i]] == nil {
return false
}
if cur[str[i]].Data != str[i] {
return false
}
if i == len(str)-1 {
//判断最后一个比较的字符是否到达叶子结点,如果不需要精确匹配就去掉这个判断
if cur[str[i]].IsEnd == true {
return true
}
}
cur = cur[str[i]].Next
}
return false
}
func main() {
tire := NewTire()
tire.insert("city")
tire.insert("cat")
tire.insert("car")
tire.insert("door")
tire.insert("dog")
tire.insert("deep")
fmt.Println("字符串数量:", tire.Len) //6
fmt.Println(tire.find("cat")) //true
fmt.Println(tire.find("ca")) //false,因为是精确匹配
fmt.Println(tire.find("cd")) //false
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。