trie树

 

golang code:

package main

import (
	"fmt"
)

// trie,根节点没有字符,然后每层一个字符, 前缀相同的是同一路径
// 如:   test, team 有相同前缀 te, warm, warn 有相同前缀war
//          __ root__
//         /         \
//        t           w
//       /           /
//      e           a
//     / \         /
//    s   a       r
//   /     \     / \
//  t	    m   m   n
//
// 这个例子是通过 字符串,查找字符串对应的值

type Node struct {
	Children map[byte]*Node // 子结点
	Priority int
}

func NewNode() *Node {
	return &Node{make(map[byte]*Node), 0}
}

type Trie struct {
	Root *Node
}

func NewTrie() *Trie {
	root := NewNode()
	return &Trie{root}
}

func (t *Trie) Insert(str string, priority int) {
	bytes := []byte(str)
	current := t.Root
	for i := 0; i < len(bytes); i++ {
		char := bytes[i]
		if node := current.Children[char]; node != nil {
			current = node
		} else {
			newnode := NewNode()
			current.Children[char] = newnode
			current = newnode
		}
	}
	current.Priority = priority
}

// 根据str, 查找其对应的priority
func (t *Trie) Find(str string) int {
	bytes := []byte(str)
	current := t.Root
	fmt.Print("find ")
	for i := 0; i < len(bytes); i++ {
		char := bytes[i]
		fmt.Print(string(char))
		if node := current.Children[char]; node == nil {
			fmt.Println(": not found")
			return -1
		} else {
			current = node
		}
	}
	priority := current.Priority
	fmt.Println(", priority: ", priority)
	return priority
}

func main() {
	words := []string{"test", "team", "space", "work", "missing", "illegal", "go", "golang"}
	priority := []int{4, 5, 6, 7, 8, 9, 10, 11}

	trie := NewTrie()

	// 建trie树
	for i := 0; i < len(words); i++ {
		trie.Insert(words[i], priority[i])
	}

	// 查找
	trie.Find("test")
	trie.Find("team")
	trie.Find("space")
	trie.Find("work")
	trie.Find("missing")
	trie.Find("illegal")
	trie.Find("go")
	trie.Find("golang")
} 

 

// 输出

find test, priority: 4

find team, priority: 5

find space, priority: 6

find work, priority: 7

find missing, priority: 8

find illegal, priority: 9

find go, priority: 10

find golang, priority: 11

成功: 进程退出代码 0.

 

posted @ 2018-05-17 14:36  北极熊129  阅读(146)  评论(0编辑  收藏  举报