二叉树的遍历

前序遍历:

递归方法:

func preorder(root *TreeNode)[]int{
    ret := []int{}
    var  order func(*TreeNode)
    order = func (node *TreeNode){
        if node ==nil{
            return
        }
        // 递归方法  先写入值 再递归左节点 再递归有节点
        ret = append(ret,node.Val)
        order(node.Left)
        order(node.Right)
    }
    order(root)
    return ret
    
} 

迭代方法:

func preorder(root *TreeNode)[]int {
    stack := []*TreeNode{}
    vals := []int{}
    node := root
     for node != nil || len(stack) > 0 {
         // 栈不为空
        for node != nil {
            // 前序遍历 先写入根节点值  再迭代左节点 直到左叶子结点
            //然后遍历右叶子结点 中左右
            vals = append(vals, node.Val)
            stack = append(stack, node)
            node = node.Left
        }
        node = stack[len(stack)-1].Right
        stack = stack[:len(stack)-1]
    }
    return vals
}

中序遍历:

递归方法:

func inorder(root *TreeNode)[]int{
    ret := []int{}
    var order func(*TreeNode)
    order = func(root *TreeNode){
        if root==nil{
            return
        }
        // 递归方法  先递归左节点 再写入值 再递归右节点
        order(root.Left)
        ret = append(ret,root.Val)
        order(root.Right)
    }
    order(root)
    return ret
}

迭代方法:

func inorder(root *TreeNode)[]int{
    ret := []int{}
    stack := []*TreeNode{}
    for root!=nil||len(stack)>0{
        for root !=nil{
            stack = append(stack,root)
            root = root.Left
            //先迭代到左叶子结点
        }
        root =stack[len(stack)-1]
        stack = stack[:len(stack)-1]
        //将结点值写入 遍历右孩子 左中右 
        ret = append(ret , root.Val)
        root=root.Right
    }
    return ret   
}

后序遍历

递归方法:

func postorderTraversal(root *TreeNode) []int {
    ret := []int{}
    var postorder func(*TreeNode)
    postorder = func (root *TreeNode){
    if root == nil{
        return
    }
    // 递归方法  先递归左节点 再递归右节点 再写入值 
    postorder(root.Left)
    postorder(root.Right)
    ret = append(ret , root.Val)
    return 
    }
    postorder(root)
    return ret
}

迭代方法:

func postorderTraversal(root *TreeNode) (res []int) {
    stk := []*TreeNode{}
    var prev *TreeNode
    //左右中
    for root != nil || len(stk) > 0 {
        for root != nil {
            stk = append(stk, root)
            root = root.Left
            //遍历到左叶子结点
        }
        root = stk[len(stk)-1]
        stk = stk[:len(stk)-1]
        // 需要先写入右孩子节点 判断右孩子是否为空 为空就填值 不为空就放回栈 遍历右孩子的子树
        if root.Right == nil || root.Right == prev {
            res = append(res, root.Val)
            prev = root
            root = nil
        } else {
            stk = append(stk, root)
            root = root.Right
        }
    }
    return
}