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 }