Skip to content

Commit 2f33e19

Browse files
author
hero
committed
tire_tree 模糊匹配完成
1 parent 132d1ab commit 2f33e19

File tree

2 files changed

+27
-36
lines changed

2 files changed

+27
-36
lines changed

tree/tire_tree.go

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package tree
22

3-
import "fmt"
4-
53
type Trie struct {
64
node map[rune]*Trie
5+
val string
76
isLast bool
87
}
98

@@ -19,6 +18,7 @@ func (t *Trie) Insert(word string) {
1918
}
2019
t = t.node[v] //找到节点,跳到下一个节点
2120
}
21+
t.val = word
2222
t.isLast = true
2323
}
2424

@@ -42,40 +42,29 @@ func (t *Trie) StartsWith(prefix string) bool {
4242
return true
4343
}
4444

45-
func (t *Trie) GetAll(prefix string) *[]interface{} {
46-
data := new([]interface{})
47-
node := map[rune]*Trie{}
48-
for _, v := range prefix { //找到全匹配下的节点
49-
if t.node[v] != nil {
50-
if t.node[v].isLast { //判断当前节点是不是一个完整单词
51-
*data = append(*data, prefix)
52-
}
53-
t = t.node[v] //跳到下一个节点
54-
node = t.node
55-
45+
//查找数据
46+
func (t *Trie) SearchNode(key string) (res []interface{}) {
47+
root := t
48+
for _, v := range key {
49+
if v, ok := root.node[v]; ok {
50+
root.node = v.node
51+
} else {
52+
return
5653
}
5754
}
58-
getNodeAll(prefix, node, data)
59-
return data
60-
}
61-
62-
var a string
63-
64-
func getNodeAll(prefix string, node map[rune]*Trie, data *[]interface{}) {
65-
fmt.Println("---------------------- prefix ", prefix)
66-
for k, v := range node {
67-
fmt.Println("---------------------- prefix v1 ", prefix)
68-
69-
prefix = prefix + string(k)
70-
fmt.Println("---------------------- prefix v2 ", prefix)
71-
//fmt.Println(string(k),prefix)
72-
if v.isLast {
73-
fmt.Println("---------------------- 获得结果", prefix)
74-
*data = append(*data, prefix)
75-
}
76-
if v.node != nil {
77-
fmt.Println("---------------------- getNodeAll", prefix)
78-
getNodeAll(prefix, v.node, data)
55+
var queue []*Trie
56+
queue = append(queue, root)
57+
for len(queue) > 0 {
58+
var childQueue []*Trie
59+
for _, v := range queue { //遍历这层的数据
60+
if v.isLast {
61+
res = append(res, v.val)
62+
}
63+
for _, vi := range v.node { //把下一次的数据进行遍历
64+
childQueue = append(childQueue, vi)
65+
}
7966
}
67+
queue = childQueue
8068
}
69+
return
8170
}

tree/tire_tree_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ import "testing"
44

55
func TestTrie_Insert(t *testing.T) {
66
trie := Constructor()
7-
trie.Insert("apple")
7+
trie.Insert("abp")
88
t.Log(trie.Search("apple"))
99
t.Log(trie.Search("app"))
1010
t.Log(trie.StartsWith("app"))
1111
trie.Insert("abe")
12-
t.Log(trie.GetAll("a"))
12+
trie.Insert("aef")
13+
t.Log(trie.SearchNode("ae"))
14+
1315
}

0 commit comments

Comments
 (0)