Last active
March 16, 2016 19:26
-
-
Save squiidz/7b4333f1ce717dfbb482 to your computer and use it in GitHub Desktop.
Simple Binary tree in Go
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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