diff --git a/binary_tree_230804/main_test.go b/binary_tree_230804/main_test.go new file mode 100644 index 0000000..9d1bc31 --- /dev/null +++ b/binary_tree_230804/main_test.go @@ -0,0 +1,169 @@ +package main + +import ( + "fmt" + "testing" +) + +type node struct { + left *node + right *node + value string +} + +func preOrder(n *node) { + if n != nil { + visit(n) + preOrder(n.left) + preOrder(n.right) + } +} + +func preOrder2(n *node) { + stack := NewStack() + p := n + for p != nil || !stack.IsEmpty() { + if p != nil { + stack.Push(p) + visit(p) + p = p.left + } else { + x, err := stack.Pop() + if err != nil { + fmt.Print(err.Error()) + p = nil + break + } + p = x.(*node) + p = p.right + } + } +} + +func inOrder(n *node) { + if n != nil { + inOrder(n.left) + visit(n) + inOrder(n.right) + } +} + +func inOrder2(n *node) { + stack := NewStack() + p := n + for p != nil || !stack.IsEmpty() { + if p != nil { + stack.Push(p) + p = p.left + } else { + x, err := stack.Pop() + if err != nil { + fmt.Print(err.Error()) + p = nil + break + } + p = x.(*node) + visit(p) + p = p.right + } + } +} + +func postOrder(n *node) { + if n != nil { + postOrder(n.left) + postOrder(n.right) + visit(n) + } +} + +func postOrder2(n *node) { + stack := NewStack() + p := n + var r *node = nil + for p != nil || !stack.IsEmpty() { + if p != nil { + stack.Push(p) + p = p.left + } else { + x := stack.Top() + if x == nil { + break + } + p = x.(*node) + if p.right != nil && p.right != r { + p = p.right + stack.Push(p) + p = p.left + } else { + x, err := stack.Pop() + if err != nil { + fmt.Print(err.Error()) + p = nil + break + } + p = x.(*node) + visit(p) + r = p + p = nil + } + } + } +} + +func visit(n *node) { + fmt.Printf("Visiting Node: %s\n", n.value) +} + +func makeBinaryTree() *node { + ln1 := &node{ + value: "D", + } + ln2 := &node{ + value: "E", + } + ln := &node{ + value: "B", + left: ln1, + right: ln2, + } + rn := &node{ + value: "C", + } + n := &node{ + value: "A", + left: ln, + right: rn, + } + return n +} + +func TestPreOrder(t *testing.T) { + n := makeBinaryTree() + preOrder(n) +} + +func TestPreOrder2(t *testing.T) { + n := makeBinaryTree() + preOrder2(n) +} + +func TestInOrder(t *testing.T) { + n := makeBinaryTree() + inOrder(n) +} + +func TestInOrder2(t *testing.T) { + n := makeBinaryTree() + inOrder2(n) +} + +func TestPostOrder(t *testing.T) { + n := makeBinaryTree() + postOrder(n) +} + +func TestPostOrder2(t *testing.T) { + n := makeBinaryTree() + postOrder2(n) +} diff --git a/binary_tree_230804/stack.go b/binary_tree_230804/stack.go new file mode 100644 index 0000000..31bf6f6 --- /dev/null +++ b/binary_tree_230804/stack.go @@ -0,0 +1,39 @@ +package main + +import "errors" + +type Stack []interface { +} + +func NewStack() Stack { + return Stack{} +} + +func (s Stack) IsEmpty() bool { + return len(s) == 0 +} + +func (s *Stack) Push(item interface{}) error { + *s = append(*s, item) + return nil +} + +func (s *Stack) Pop() (interface{}, error) { + if s.IsEmpty() { + return nil, errors.New("stack is empty") + } + ret := (*s)[len(*s)-1] + *s = (*s)[:len(*s)-1] + return ret, nil +} + +func (s Stack) Top() interface{} { + if s.IsEmpty() { + return nil + } + return s[len(s)-1] +} + +func (s Stack) Len() int { + return len(s) +} diff --git a/prime_factors_230805/main_test.go b/prime_factors_230805/main_test.go new file mode 100644 index 0000000..6c5ab47 --- /dev/null +++ b/prime_factors_230805/main_test.go @@ -0,0 +1,45 @@ +package main + +import ( + "reflect" + "testing" +) + +func PrimeFactorsOf(n int) []int { + ret := make([]int, 0) + d := 2 + for d < n { + for n%d == 0 { + ret = append(ret, d) + n /= d + } + d++ + } + if n > 1 { + ret = append(ret, n) + } + return ret +} + +func TestPrimeFactorsOf(t *testing.T) { + tt := []struct { + name string + input int + want []int + }{ + {"1", 1, []int{}}, + {"2", 2, []int{2}}, + {"4", 4, []int{2, 2}}, + {"6", 6, []int{2, 3}}, + {"8", 8, []int{2, 2, 2}}, + {"9", 9, []int{3, 3}}, + {"a very large number", 2 * 3 * 5 * 17 * 71 * 73, []int{2, 3, 5, 17, 71, 73}}, + } + + for _, tc := range tt { + got := PrimeFactorsOf(tc.input) + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("PrimeFactorsOf(%d) = %v, want %v", tc.input, got, tc.want) + } + } +} diff --git a/reverse_string+230804/main_test.go b/reverse_string_230804/main_test.go similarity index 100% rename from reverse_string+230804/main_test.go rename to reverse_string_230804/main_test.go diff --git a/reverse_string_230805/main_test.go b/reverse_string_230805/main_test.go new file mode 100644 index 0000000..db817b2 --- /dev/null +++ b/reverse_string_230805/main_test.go @@ -0,0 +1,33 @@ +package main + +import "testing" + +func ReverseString(s string) string { + tmp := []rune(s) + l := len(tmp) + for i := 0; i < l/2; i++ { + tmp[i], tmp[l-i-1] = tmp[l-i-1], tmp[i] + } + return string(tmp) +} + +func TestReverseString(t *testing.T) { + tt := []struct { + name string + input string + want string + }{ + {"test", "test", "tset"}, + {"testing", "testing", "gnitset"}, + {"i am testing", "i am testing", "gnitset ma i"}, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + got := ReverseString(tc.input) + if got != tc.want { + t.Errorf("ReverseString(%s) = %s, want %s", tc.input, got, tc.want) + } + }) + } +}