go + 迭代

package main
import . "nc_tools"
/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 
 * @param root TreeNode类 the root of binary tree
 * @return int整型二维数组
*/
func threeOrders( root *TreeNode ) [][]int {
    // write code here
    if root == nil {
        return nil
    }

    ret := make([][]int, 0)
    ret = append(ret, pre(root), middle(root), suff(root))

    return ret
}


func pre(root *TreeNode) []int {
    r := make([]int, 0)

    stack := []*TreeNode{root}

    for len(stack) > 0 {
        top := stack[len(stack)-1]
        if top != nil {
            stack = stack[:len(stack)-1]

            if top.Right != nil {
                stack = append(stack, top.Right)
            }
            if top.Left != nil {
                stack =append(stack, top.Left)
            }
            stack = append(stack, top, (*TreeNode)(nil))
        }else{
            node := stack[len(stack)-2]
            r = append(r, node.Val)
            stack = stack[:len(stack)-2]
        }
    }

    return r
}


func middle(root *TreeNode) []int {
    r := make([]int, 0)

    stack := []*TreeNode{root}

    for len(stack) > 0 {
        top := stack[len(stack)-1]
        if top != nil {
            stack = stack[:len(stack)-1]

            if top.Right != nil {
                stack = append(stack, top.Right)
            }
            stack = append(stack, top, (*TreeNode)(nil))
            if top.Left != nil {
                stack =append(stack, top.Left)
            }
        }else{
            node := stack[len(stack)-2]
            r = append(r, node.Val)
            stack = stack[:len(stack)-2]
        }
    }

    return r
}

func suff(root *TreeNode) []int{
    r := make([]int, 0)

    stack := []*TreeNode{root}

    for len(stack) > 0 {
        top := stack[len(stack)-1]
        if top != nil {
            stack = stack[:len(stack)-1]
            stack = append(stack, top, (*TreeNode)(nil))

            if top.Right != nil {
                stack = append(stack, top.Right)
            }
            if top.Left != nil {
                stack =append(stack, top.Left)
            }
        }else{
            node := stack[len(stack)-2]
            r = append(r, node.Val)
            stack = stack[:len(stack)-2]
        }
    }

    return r
}