mirror of
https://github.com/cubixle/codekata-golang.git
synced 2026-04-24 23:54:44 +01:00
110 lines
1.4 KiB
Go
110 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
)
|
|
|
|
func preOrder(n *node) {
|
|
stack := MakeStack()
|
|
p := n
|
|
for p != nil || !stack.IsEmpty() {
|
|
if p != nil {
|
|
visit(p)
|
|
stack.Push(p)
|
|
p = p.left
|
|
} else {
|
|
p = stack.Pop().(*node)
|
|
p = p.right
|
|
}
|
|
}
|
|
}
|
|
|
|
func inOrder(n *node) {
|
|
stack := MakeStack()
|
|
p := n
|
|
for p != nil || !stack.IsEmpty() {
|
|
if p != nil {
|
|
stack.Push(p)
|
|
p = p.left
|
|
} else {
|
|
p = stack.Pop().(*node)
|
|
visit(p)
|
|
p = p.right
|
|
}
|
|
}
|
|
}
|
|
|
|
func postOrder(n *node) {
|
|
stack := MakeStack()
|
|
p := n
|
|
var r *node = nil
|
|
for p != nil || !stack.IsEmpty() {
|
|
if p != nil {
|
|
stack.Push(p)
|
|
p = p.left
|
|
} else {
|
|
p = stack.Top().(*node)
|
|
if p.right != nil && p.right != r {
|
|
p = p.right
|
|
stack.Push(p)
|
|
p = p.left
|
|
} else {
|
|
p = stack.Pop().(*node)
|
|
visit(p)
|
|
r = p
|
|
p = nil
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestPreOrder(t *testing.T) {
|
|
preOrder(makeBinaryTree())
|
|
}
|
|
|
|
func TestInOrder(t *testing.T) {
|
|
inOrder(makeBinaryTree())
|
|
}
|
|
|
|
func TestPostOrder(t *testing.T) {
|
|
postOrder(makeBinaryTree())
|
|
}
|
|
|
|
func visit(n *node) {
|
|
if n == nil {
|
|
return
|
|
}
|
|
fmt.Printf("visiting node %s\n", n.value)
|
|
}
|
|
|
|
type node struct {
|
|
left *node
|
|
right *node
|
|
value string
|
|
}
|
|
|
|
func makeBinaryTree() *node {
|
|
return &node{
|
|
left: &node{
|
|
left: &node{
|
|
value: "D",
|
|
},
|
|
right: &node{
|
|
value: "E",
|
|
},
|
|
value: "B",
|
|
},
|
|
right: &node{
|
|
left: &node{
|
|
value: "F",
|
|
},
|
|
right: &node{
|
|
value: "G",
|
|
},
|
|
value: "C",
|
|
},
|
|
value: "A",
|
|
}
|
|
}
|