Goに慣れるためとアルゴリズムの復習の為に週1ぐらいで更新していきます。アルゴリズムクイックリファレンス 第2版を読んで各種アルゴリズムをGoで実装して行きます。
前回: Goでのアルゴリズムクイックリファレンス第2版(ブルームフィルタ)
今回は二分探索木
二分探索木(にぶんたんさくぎ、英: binary search tree)は、コンピュータプログラムにおいて、「左の子孫の値 ≤ 親の値 ≤ 右の子孫の値」という制約を持つ二分木である。探索木のうちで最も基本的な木構造である。
package main
import "fmt"
type BinaryNode struct {
Value int
Left *BinaryNode
Right *BinaryNode
}
type BinaryTree struct {
Root *BinaryNode
}
func NewBinaryNode(val int) *BinaryNode {
return &BinaryNode{val, new(BinaryNode), new(BinaryNode)}
}
func (n *BinaryTree) Add(val int) {
if n.Root == nil {
n.Root = NewBinaryNode(val)
} else {
n.Root.Add(val)
}
}
func (n *BinaryNode) Add(val int) {
if val <= n.Value {
if n.Left != nil {
n.Left.Add(val)
} else {
n.Left = NewBinaryNode(val)
}
} else {
if n.Right != nil {
n.Right.Add(val)
} else {
n.Right = NewBinaryNode(val)
}
}
}
func (n *BinaryTree) Contains(target int) bool {
node := n.Root
for node != nil {
if target < node.Value {
node = node.Left
} else if target > node.Value {
node = node.Right
} else {
return true
}
}
return false
}
func main() {
bn := new(BinaryTree)
bn.Add(1)
bn.Add(2)
bn.Add(3)
bn.Add(100)
if bn.Contains(4) == false {
fmt.Println("not found")
}
if bn.Contains(100) {
fmt.Println("found")
}
}
次回は深さ優先探索です。