JZ59 按之字形顺序打印二叉树

按之字形顺序打印二叉树

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

 
思路:最暴力的方法就是使用队列进行层次遍历,使用sz存储每层的节点个数。然后反转偶数层就可以了。
优化方法:使用两个栈,一个栈存奇数层的结果,按照先左孩子节点后右孩子节点的方式压栈。另一个栈存偶数层的结果,按照先右孩子节点再左孩子结点的方式压栈。
 
func Print(pRoot *TreeNode) [][]int {
    var res [][]int
    if pRoot == nil {
        return res
    }
    
    var odd, even []*TreeNode
    odd = append(odd, pRoot)
    for len(odd) != 0 || len(even) != 0 {
        var tmp *TreeNode 
        var vtmp []int
        for len(odd) != 0 {
            tmp = odd[len(odd)-1]
            odd = odd[:len(odd)-1]
            vtmp = append(vtmp, tmp.Val)
            if tmp.Left != nil {
                even = append(even, tmp.Left)
            }
            if tmp.Right != nil {
                even = append(even, tmp.Right)
            }
            
        }
        if len(vtmp) !=0 {
            res = append(res, vtmp)
        }
        
        vtmp = nil
        for len(even) != 0 {
            tmp = even[len(even)-1]
            even = even[:len(even)-1]
            vtmp = append(vtmp, tmp.Val)
            if tmp.Right != nil {
                odd = append(odd, tmp.Right)
            }
            if tmp.Left != nil {
                odd = append(odd, tmp.Left)
            }
            
        }
        if len(vtmp) !=0 {
            res = append(res, vtmp)
        }
        
    }
    return res
}

 

posted @ 2021-04-11 00:26  zqlucky  阅读(64)  评论(0编辑  收藏  举报