diff --git a/treeiter/README.md b/treeiter/README.md new file mode 100644 index 0000000..380ce21 --- /dev/null +++ b/treeiter/README.md @@ -0,0 +1,9 @@ +# treeiter + +В этой задаче нужно написать итератор по бинарному дереву. + +Итератор должен принимать на вход дерево и +функцию с одним аргументом типа дерева, не возвращающую ничего. +Сигнатуру необходимо придумать самостоятельно так, чтобы прошли тесты. + +Пример использования итератора можно посмотреть в `treeiter_example_test.go` diff --git a/treeiter/treeiter.go b/treeiter/treeiter.go new file mode 100644 index 0000000..075bde3 --- /dev/null +++ b/treeiter/treeiter.go @@ -0,0 +1,3 @@ +//go:build !solution + +package treeiter diff --git a/treeiter/treeiter_example_test.go b/treeiter/treeiter_example_test.go new file mode 100644 index 0000000..95724fc --- /dev/null +++ b/treeiter/treeiter_example_test.go @@ -0,0 +1,24 @@ +package treeiter + +import "fmt" + +func ExampleDoInOrder() { + tree := &ValuesNode[string]{ + value: "root", + left: &ValuesNode[string]{ + value: "left", + }, + right: &ValuesNode[string]{ + value: "right", + }, + } + + DoInOrder(tree, func(t *ValuesNode[string]) { + fmt.Println(t.value) + }) + + // Output: + // left + // root + // right +} diff --git a/treeiter/treeiter_test.go b/treeiter/treeiter_test.go new file mode 100644 index 0000000..2dbb5ce --- /dev/null +++ b/treeiter/treeiter_test.go @@ -0,0 +1,70 @@ +package treeiter + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +type ValuesNode[T any] struct { + value T + left, right *ValuesNode[T] +} + +func (t ValuesNode[T]) Left() *ValuesNode[T] { + return t.left +} + +func (t ValuesNode[T]) Right() *ValuesNode[T] { + return t.right +} + +type Collector[T any] struct { + nodes []*ValuesNode[T] +} + +func (c *Collector[T]) Collect(tree *ValuesNode[T]) { + c.nodes = append(c.nodes, tree) +} + +func TestInOrderNil(t *testing.T) { + var collector Collector[any] + DoInOrder(nil, collector.Collect) +} + +func TestInOrderIntTree(t *testing.T) { + root := &ValuesNode[int]{value: 1} + collector := Collector[int]{} + + DoInOrder(root, collector.Collect) + + assert.Equal(t, []*ValuesNode[int]{{value: 1}}, collector.nodes) +} + +func TestInOrderStringTree(t *testing.T) { + rightLeftRight := &ValuesNode[string]{ + value: "right left right", + } + rightLeft := &ValuesNode[string]{ + value: "right left", + right: rightLeftRight, + } + right := &ValuesNode[string]{ + value: "right", + left: rightLeft, + } + left := &ValuesNode[string]{ + value: "left", + } + + root := &ValuesNode[string]{ + value: "root", + left: left, + right: right, + } + var collector Collector[string] + + DoInOrder(root, collector.Collect) + + assert.Equal(t, []*ValuesNode[string]{left, root, rightLeft, rightLeftRight, right}, collector.nodes) +}