mirror of
https://github.com/cubixle/codekata-golang.git
synced 2026-04-24 19:54:43 +01:00
200 lines
2.7 KiB
Go
200 lines
2.7 KiB
Go
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 postOrder22(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 {
|
|
p = stack.Top().(*node)
|
|
if p.right != nil && p.right != r {
|
|
p = p.right
|
|
stack.Push(p)
|
|
p = p.left
|
|
} else {
|
|
x, _ := stack.Pop()
|
|
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)
|
|
}
|
|
|
|
func TestPostOrder22(t *testing.T) {
|
|
n := makeBinaryTree()
|
|
postOrder22(n)
|
|
}
|