LoginSignup
4
2

More than 5 years have passed since last update.

Goでのアルゴリズムクイックリファレンス第2版(二分探索木)

Posted at

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")
    }
}

次回は深さ優先探索です。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2