Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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()
}
}