package main
import (
"unsafe"
"fmt"
)
type TreeNode struct {
x int
lchild *TreeNode
rchild *TreeNode
}
type Tree TreeNode
func initTreeNode(x []int) []*TreeNode {
nodes:=make([]*TreeNode,len(x))
for i:=0; i<len(x); i++ {
nodes[i]=&TreeNode{x[i],nil,nil}
}
return nodes
}
func quichSort(nodes []*TreeNode,s int,t int) {
if s>=t {
return
}
key:=nodes[s]
i:=s
j:=t
for i<j {
for i<j && nodes[j].x>=key.x {
j--
}
if i<j {
nodes[i],nodes[j]=nodes[j],nodes[i]
}
for i<j && nodes[i].x<=key.x {
i++
}
if i<j {
nodes[i],nodes[j]=nodes[j],nodes[i]
}
}
quichSort(nodes,s,i-1)
quichSort(nodes,i+1,t)
}
func insertNode(nodes []*TreeNode,m *TreeNode) []*TreeNode {
n:=len(nodes)
y:=make([]*TreeNode,n+1)
copy(y,nodes)
for i:=n; i>=0; i-- {
if i>0 && y[i-1].x>=m.x {
y[i]=y[i-1]
} else {
y[i]=m
break
}
}
return y
}
func createTree(nodes []*TreeNode) *Tree {
node1:=nodes[0]
node2:=nodes[1]
node:=&TreeNode{node1.x+node2.x,node1,node2}
n:=len(nodes)
if n<3 {
return (*Tree)(unsafe.Pointer(node))
} else {
y:=make([]*TreeNode,n-2)
copy(y,nodes[2:])
y=insertNode(y,node)
return createTree(y)
}
}
func pretravel(tree *Tree) {
node:=(*TreeNode)(unsafe.Pointer(tree))
fmt.Print(node.x," ")
if node.lchild!=nil {
pretravel((*Tree)(unsafe.Pointer(node.lchild)))
}
if node.rchild!=nil {
pretravel((*Tree)(unsafe.Pointer(node.rchild)))
}
}
func midtravel(tree *Tree) {
node:=(*TreeNode)(unsafe.Pointer(tree))
if node.lchild!=nil {
midtravel((*Tree)(unsafe.Pointer(node.lchild)))
}
fmt.Print(node.x," ")
if node.rchild!=nil {
midtravel((*Tree)(unsafe.Pointer(node.rchild)))
}
}
func lasttravel(tree *Tree) {
node:=(*TreeNode)(unsafe.Pointer(tree))
if node.lchild!=nil {
lasttravel((*Tree)(unsafe.Pointer(node.lchild)))
}
if node.rchild!=nil {
lasttravel((*Tree)(unsafe.Pointer(node.rchild)))
}
fmt.Print(node.x," ")
}
func main() {
x:=[]int{29,8,14,7,23}
nodes:=initTreeNode(x)
quichSort(nodes,0,len(nodes)-1)
tree:=createTree(nodes)
pretravel(tree)
midtravel(tree)
lasttravel(tree)
}