Skip to content

Commit b3fb08f

Browse files
committed
feat: update trie
1 parent fa63cf4 commit b3fb08f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+19099
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
## 树 tree
2020
* [BinaryTree](https://github.com/treeforest/algorithm/tree/master/tree/BinaryTree): 二叉树(二叉搜索树)
2121
* [RBTree](https://github.com/treeforest/algorithm/tree/master/tree/RBTree): 红黑树(实现有序集合 K-V 的存储)
22+
* [Trie](https://github.com/treeforest/algorithm/tree/master/tree/Trie): 前缀树trie
2223

2324
## 图论 graph
2425
* [AdjacencyMatrix](https://github.com/treeforest/algorithm/tree/master/Graph/AdjacencyMatrix): 图的邻接矩阵存储(模板实现)

tree/Trie/go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module github.com/treeforest/algorithm/tree/Trie
2+
3+
go 1.15
4+
5+
require github.com/stretchr/testify v1.7.0

tree/Trie/go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
3+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
4+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
5+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
6+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

tree/Trie/trie.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package trie
2+
3+
// trieNode trie节点
4+
type TrieNode struct {
5+
// data 当前节点存储的值
6+
data rune
7+
// isEnd 标记一个关键字结尾
8+
isEnd bool
9+
// children 该节点的子节点
10+
children map[rune]*TrieNode
11+
}
12+
13+
func NewTrieNode(data rune) *TrieNode {
14+
return &TrieNode{
15+
data: data,
16+
isEnd: false,
17+
children: make(map[rune]*TrieNode),
18+
}
19+
}
20+
21+
// Trie trie树
22+
type Trie struct {
23+
// root trie根节点
24+
root *TrieNode
25+
}
26+
27+
func NewTrie() *Trie {
28+
return &Trie{root: NewTrieNode(rune('/'))}
29+
}
30+
31+
// Insert 插入一个关键字
32+
func (trie *Trie) Insert(key string) {
33+
node := trie.root
34+
for _, v := range key { // 注:for range采用Unicode字符遍历
35+
child, ok := node.children[v]
36+
if !ok {
37+
child = NewTrieNode(v)
38+
node.children[v] = child
39+
}
40+
node = child
41+
}
42+
node.isEnd = true
43+
}
44+
45+
// Find 查找关键字,存在返回true,否则返回false
46+
func (trie *Trie) Find(key string) bool {
47+
node := trie.root
48+
for _, v := range key {
49+
child, ok := node.children[v]
50+
if !ok {
51+
return false
52+
}
53+
node = child
54+
}
55+
return node.isEnd
56+
}

tree/Trie/trie_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package trie
2+
3+
import (
4+
"testing"
5+
"github.com/stretchr/testify/assert"
6+
)
7+
8+
func TestTrie(t *testing.T) {
9+
keys := []string{
10+
"hi",
11+
"hello",
12+
"world",
13+
"height",
14+
"he",
15+
"him",
16+
"Hi",
17+
"中国",
18+
"成都",
19+
"北京欢迎您",
20+
}
21+
22+
trie := NewTrie()
23+
for _, key := range keys {
24+
trie.Insert(key)
25+
}
26+
27+
assert.Equal(t, true, trie.Find("hi"))
28+
assert.Equal(t, true, trie.Find("中国"))
29+
assert.Equal(t, false, trie.Find("h"))
30+
assert.Equal(t, false, trie.Find("北京"))
31+
assert.Equal(t, false, trie.Find("heigh"))
32+
33+
34+
35+
}

tree/Trie/vendor/github.com/davecgh/go-spew/LICENSE

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tree/Trie/vendor/github.com/davecgh/go-spew/spew/bypass.go

Lines changed: 152 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tree/Trie/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go

Lines changed: 38 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)