package main
import "fmt"
/*
分别按照二叉树先序,中序和后序打印所有的节点。
输入
{1,2,3}
输出
[[1,2,3],[2,1,3],[2,3,1]]
*/
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
var pres, ins, posts []int
func threeOrders(root *TreeNode) [][]int {
res := make([][]int, 3)
res[0] = preOrder(root)
res[1] = midOrder(root)
res[2] = postOrder(root)
return res
}
func preOrder(root *TreeNode) []int{
arr := make([]int, 0)
if root == nil{
return arr
}
arr = append(arr, root.Val)
arr = append(arr, preOrder(root.Left)...)
arr = append(arr, preOrder(root.Right)...)
return arr
}
func midOrder(root *TreeNode) []int{
arr := make([]int, 0)
if root == nil{
return arr
}
arr = append(arr, midOrder(root.Left)...)
arr = append(arr, root.Val)
arr = append(arr, midOrder(root.Right)...)
return arr
}
func postOrder(root *TreeNode) []int{
arr := make([]int, 0)
if root == nil{
return arr
}
arr = append(arr, postOrder(root.Left)...)
arr = append(arr, postOrder(root.Right)...)
arr = append(arr, root.Val)
return arr
}
func preOrderTraversal( root *TreeNode ) []int{
arr := make([]int, 0)
if root == nil {
return arr
}
stack := make([]*TreeNode, 0)
for len(stack) > 0 || root != nil{
for root != nil{
arr = append(arr, root.Val)
stack = append(stack, root)
root = root.Left
}
root = stack[len(stack) - 1].Right
stack = stack[:len(stack) - 1]
}
return arr
}
func midOrderTraversal( root *TreeNode ) []int{
arr := make([]int, 0)
if root == nil {
return arr
}
stack := make([]*TreeNode, 0)
for len(stack) > 0 || root != nil{
for root != nil{
stack = append(stack, root)
root = root.Left
}
root = stack[len(stack) - 1]
arr = append(arr, root.Val)
root = root.Right
stack = stack[:len(stack) - 1]
}
return arr
}
func postOrderTraversal( root *TreeNode ) []int{
arr := make([]int, 0)
if root == nil {
return arr
}
stack := make([]*TreeNode, 0)
var lastNode *TreeNode
for len(stack) > 0 || root != nil{
for root != nil{
stack = append(stack, root)
root = root.Left
}
root = stack[len(stack) - 1]
stack = stack[:len(stack) - 1]
if root.Right == nil || lastNode == root.Right {
arr = append(arr, root.Val)
lastNode = root
root = nil
}else{
stack = append(stack, root)
root = root.Right
}
}
return arr
}
func main(){
a := new(TreeNode)
a.Val = 1
b := new(TreeNode)
b.Val = 2
c := new(TreeNode)
c.Val = 3
a.Left = b
a.Right = c
res := threeOrders(a)
fmt.Println(res)
}