Skip to content

Commit

Permalink
Merge pull request #243 from vaskoz/day116
Browse files Browse the repository at this point in the history
Day116
  • Loading branch information
vaskoz committed Dec 16, 2018
2 parents e05da60 + c9b8ebf commit c6cbf9a
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,3 +124,4 @@ problems from
* [Day 112](https://github.com/vaskoz/dailycodingproblem-go/issues/235)
* [Day 113](https://github.com/vaskoz/dailycodingproblem-go/issues/236)
* [Day 114](https://github.com/vaskoz/dailycodingproblem-go/issues/237)
* [Day 116](https://github.com/vaskoz/dailycodingproblem-go/issues/242)
42 changes: 42 additions & 0 deletions day116/problem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package day116

// UnboundBinaryTree is a tree that lazily grows.
type UnboundBinaryTree interface {
Value() interface{}
Left() UnboundBinaryTree
Right() UnboundBinaryTree
}

type ubtTree struct {
value interface{}
left, right *ubtTree
}

// Left returns the left child of this node.
// Returns nil if the variable is set to nil.
func (ubt *ubtTree) Left() UnboundBinaryTree {
if ubt.left == nil {
ubt.left = &ubtTree{}
}
return ubt.left
}

// Right returns the left child of this node.
// Returns nil if the variable is set to nil.
func (ubt *ubtTree) Right() UnboundBinaryTree {
if ubt.right == nil {
ubt.right = &ubtTree{}
}
return ubt.right
}

// Value returns the value stored at this node.
// Returns nil if the variable is set to nil.
func (ubt *ubtTree) Value() interface{} {
return ubt.value
}

// GenerateUnboundBinaryTree runs in O(1) time.
func GenerateUnboundBinaryTree() UnboundBinaryTree {
return &ubtTree{}
}
29 changes: 29 additions & 0 deletions day116/problem_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package day116

import "testing"

func TestGenerateUnboundBinaryTree(t *testing.T) {
t.Parallel()
tree := GenerateUnboundBinaryTree()
for i := 0; i < 1000; i++ {
tree = tree.Left()
tree = tree.Right()
}
if tree.Value() != UnboundBinaryTree(nil) {
t.Errorf("The values are always nil of the interface type")
}
if tree.Left() == nil {
t.Errorf("The tree should be infinite. Left is nil")
}
if tree.Right() == nil {
t.Errorf("The tree should be infinite. Right is nil")
}
}

func BenchmarkGenerateUnboundBinaryTree(b *testing.B) {
tree := GenerateUnboundBinaryTree()
for i := 0; i < b.N; i++ {
tree = tree.Left()
tree = tree.Right()
}
}

0 comments on commit c6cbf9a

Please sign in to comment.