From 7aece75825b6ff64d06f6db41ab0889fa481db5d Mon Sep 17 00:00:00 2001 From: David Ashby Date: Sun, 25 Jul 2021 19:29:13 -0400 Subject: [PATCH] noodling on The Practice Of Programming, Chapter 2 --- datastructures.go | 72 ++++++++++++++++++++++++++++++++++++++++++ datastructures_test.go | 25 +++++++++++++++ go.mod | 3 ++ 3 files changed, 100 insertions(+) create mode 100644 datastructures.go create mode 100644 datastructures_test.go create mode 100644 go.mod diff --git a/datastructures.go b/datastructures.go new file mode 100644 index 0000000..f863519 --- /dev/null +++ b/datastructures.go @@ -0,0 +1,72 @@ +package main + +type TreeNode interface { + Left() TreeNode + Right() TreeNode +} + +type BTreeNode struct { + left TreeNode + right TreeNode +} + +type StringyBTreeNode struct { + k string + v interface{} + BTreeNode +} + +func NewStringyBTree(k string, v interface{}) *StringyBTreeNode { + return &StringyBTreeNode{ + k: k, + v: v, + } +} + +func (sbt *StringyBTreeNode) Left() TreeNode { + return sbt.left +} + +func (sbt *StringyBTreeNode) Right() TreeNode { + return sbt.right +} + +func (sbt *StringyBTreeNode) Insert(k string, v interface{}) *StringyBTreeNode { + if sbt.k == k { + sbt.v = v // set new value + return sbt + } + newNode := &StringyBTreeNode{k: k, v: v} + if sbt.k > k { + if sbt.left == nil { + sbt.left = newNode + } else { + sbt.left.(*StringyBTreeNode).Insert(k, v) + } + } + if sbt.k < k { + if sbt.right == nil { + sbt.right = newNode + } else { + sbt.right.(*StringyBTreeNode).Insert(k, v) + } + } + return sbt +} + +func (sbt *StringyBTreeNode) Get(k string) interface{} { + if sbt.k == k { + return sbt.v + } + if sbt.k > k { + if sbt.left != nil { + return sbt.left.(*StringyBTreeNode).Get(k) + } + } + if sbt.k < k { + if sbt.right != nil { + return sbt.right.(*StringyBTreeNode).Get(k) + } + } + return nil // not found +} diff --git a/datastructures_test.go b/datastructures_test.go new file mode 100644 index 0000000..7d25518 --- /dev/null +++ b/datastructures_test.go @@ -0,0 +1,25 @@ +package main + +import ( + "testing" +) + +func TestBuildingTree(t *testing.T) { + tree := NewStringyBTree("foo", 1).Insert("bar", 2).Insert("baz", 3).Insert("quuz", 4) + if tree.Get("foo") != 1 { + t.Fail() + } + if tree.Get("bar") != 2 { + t.Fail() + } + if tree.Get("baz") != 3 { + t.Fail() + } + if tree.Get("quuz") != 4 { + t.Fail() + } + tree.Insert("bar", 5) + if tree.Get("bar") != 5 { + t.Fail() + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..4bd74e5 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module tpop + +go 1.16