时间复杂度:O(n)
解题思路
基本思路和普通的层序遍历一样,不同的是,对于第i层的结点,如果i是偶数那么就需要按照从右向左的顺序输出值。由于我们知道每一层的节点数,故可以利用左右对称的性质以及一个bool变量来判断是从右向左输出还是正常的从左向右输出。
AC代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func zigzagLevelOrder(root *TreeNode) (res [][]int) {
if root==nil{
return res
}
curIsLeft:=true
q:=[]*TreeNode{root}
for len(q)>0{
l:=len(q)
row:=make([]int,l)
for i:=0;i<l;i++{
node:=q[i]
if curIsLeft{
row[i]=node.Val
}else{
row[l-i-1]=node.Val
}
if node.Left!=nil{
q=append(q,node.Left)
}
if node.Right!=nil{
q=append(q,node.Right)
}
}
q=q[l:]
res=append(res,row)
curIsLeft=!curIsLeft
}
return
}
感悟
其实也可以按照逆向入队的方法实现逆向输出,但是实现起来需要判断是先让右孩子入队还是左孩子入队,比上面的逆序输出值的方法要复杂,不够通用。