package main
import (
"unsafe"
"fmt"
)
type TreeNode struct {
x int
childs []*TreeNode
}
type Tree TreeNode
type BTreeNode struct {
x int
lchild *BTreeNode
rchild *BTreeNode
}
type BTree BTreeNode
func createTree() *Tree {
node5:=&TreeNode{5,[]*TreeNode{}}
node6:=&TreeNode{6,[]*TreeNode{}}
node7:=&TreeNode{7,[]*TreeNode{}}
node8:=&TreeNode{8,[]*TreeNode{}}
node9:=&TreeNode{9,[]*TreeNode{}}
node10:=&TreeNode{10,[]*TreeNode{}}
node2:=&TreeNode{2,[]*TreeNode{node5,node6,node7}}
node3:=&TreeNode{3,[]*TreeNode{node8}}
node4:=&TreeNode{4,[]*TreeNode{node9,node10}}
node1:=&TreeNode{1,[]*TreeNode{node2,node3,node4}}
return (*Tree)(unsafe.Pointer(node1))
}
func convertToBTree(tree *Tree) *BTree {
root:=(*TreeNode)(unsafe.Pointer(tree))
rootb:=&BTreeNode{root.x,nil,nil}
var childs []*BTreeNode
for i:=0; i<len(root.childs); i++ {
child:=root.childs[i]
childTree:=(*Tree)(unsafe.Pointer(child))
childBTree:=convertToBTree(childTree)
childb:=(*BTreeNode)(unsafe.Pointer(childBTree))
childs=append(childs,childb)
}
for i:=0; i<len(childs); i++ {
if i==0 {
rootb.lchild=childs[i]
} else {
childs[i-1].rchild=childs[i]
}
}
return (*BTree)(unsafe.Pointer(rootb))
}
func pretravel(btree *BTree) {
root:=(*BTreeNode)(unsafe.Pointer(btree))
fmt.Print(root.x," ")
if root.lchild!=nil {
pretravel((*BTree)(unsafe.Pointer(root.lchild)))
}
if root.rchild!=nil {
pretravel((*BTree)(unsafe.Pointer(root.rchild)))
}
}
func midtravel(btree *BTree) {
root:=(*BTreeNode)(unsafe.Pointer(btree))
if root.lchild!=nil {
midtravel((*BTree)(unsafe.Pointer(root.lchild)))
}
fmt.Print(root.x," ")
if root.rchild!=nil {
midtravel((*BTree)(unsafe.Pointer(root.rchild)))
}
}
func lasttravel(btree *BTree) {
root:=(*BTreeNode)(unsafe.Pointer(btree))
if root.lchild!=nil {
lasttravel((*BTree)(unsafe.Pointer(root.lchild)))
}
if root.rchild!=nil {
lasttravel((*BTree)(unsafe.Pointer(root.rchild)))
}
fmt.Print(root.x," ")
}
func main() {
tree:=createTree()
treeb:=convertToBTree(tree)
pretravel(treeb)
fmt.Println()
midtravel(treeb)
fmt.Println()
lasttravel(treeb)
}