Skip to content

Instantly share code, notes, and snippets.

@squiidz
Last active March 16, 2016 19:26
Show Gist options
  • Save squiidz/7b4333f1ce717dfbb482 to your computer and use it in GitHub Desktop.
Save squiidz/7b4333f1ce717dfbb482 to your computer and use it in GitHub Desktop.
Simple Binary tree in Go
package main
import (
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"math/rand"
"time"
"github.com/go-zoo/trash"
)
// Data from data.json file
var data map[string][]int
func init() {
content, err := ioutil.ReadFile("data.json")
if err != nil {
trash.NewJSONErr(trash.InvalidJSONErr, err).Log()
data = make(map[string][]int)
data["data"] = SeedRandNumber(1000, 1000)
return
}
err = json.Unmarshal(content, &data)
if err != nil {
panic(trash.NewJSONErr(trash.InvalidJSONErr, err).Log())
}
}
// Node struct
type Node struct {
data int
left *Node
right *Node
}
func insert(n *Node, data int) *Node {
if n == nil {
n = NewNode(data)
} else if data <= n.data {
n.left = insert(n.left, data)
} else {
n.right = insert(n.right, data)
}
return n
}
func (n *Node) search(data int) bool {
if n == nil {
return false
} else if data == n.data {
return true
} else if data <= n.data {
return n.left.search(data)
}
return n.right.search(data)
}
// NewNode return a node instance
func NewNode(data int) *Node {
newNode := &Node{}
newNode.data = data
newNode.left = &Node{}
newNode.right = &Node{}
return newNode
}
// SeedRandNumber return a array on random generated numbers
func SeedRandNumber(size int, max int) []int {
var seeds []int
src := rand.NewSource(time.Now().UnixNano())
rnd := rand.New(src)
for i := 0; i < size; i++ {
seeds = append(seeds, rnd.Intn(max))
}
return seeds
}
// buildTree build a tree with the provided int array
func buildTree(seed []int) *Node {
root := &Node{}
treeBuildStart := time.Now()
for i, n := range data["data"] {
fmt.Printf("# Adding number %d/1000 -> %d\n", i+1, n)
root = insert(root, n)
}
fmt.Printf("[+] Tree Generation done in %s !!\n", time.Since(treeBuildStart))
return root
}
// finNumber search for the provided number and log the result
func findNumber(root *Node, nbr int) {
findTime := time.Now()
if root.search(nbr) {
fmt.Printf("[+] Number %d found in %s !\n", nbr, time.Since(findTime))
} else {
fmt.Printf("[!] Number %d NOT found !\n", nbr)
}
}
func main() {
nbr := flag.Int("look", 0, "look 345")
flag.Parse()
root := buildTree(data["data"])
findNumber(root, *nbr)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment