二叉树的迭代遍历

主题思想

迭代就是不使用递归,使用压栈入栈的形式实现遍历,关键在于使用过的节点代表着不再用了,再其前面加一个空指针来做一个标记
(如果左右节点为空切记不要加入相应的遍历,不然会对空指针进行操作)

此为万能模板,只需要调动中间三个节点(中左右)的压栈顺序即可。

示例代码

中序遍历


```go
func inorderTraversal(root *TreeNode) []int {
    if root==nil{
        return []int{}
    }

    result:=[]int{}
    stack:=[]*TreeNode{}
    stack=append(stack,root)
    for len(stack)!=0 {
        cur:=stack[len(stack)-1]
        stack=stack[:len(stack)-1]
        if cur!=nil{
            if cur.Right!=nil{
                stack=append(stack,cur.Right)
            } 

            stack=append(stack,cur)
            stack=append(stack,nil)

            if cur.Left!=nil{
            stack=append(stack,cur.Left)
            }
        }else{
            result=append(result,stack[len(stack)-1].Val)
            stack=stack[:len(stack)-1]
        }
    }

    return result
}

你可能感兴趣的:(算法)