给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
第一次的代码:
在上一题的基础上添加一些代码就成,既然是锯齿形,则和我们选择左树还是右树作为开始有关。通过count记录这一层该从左树开始还是从右树开始遍历,而每一次我们都要当前层节点取反,即tr=tr[::-1],因为我们正常来说加入的顺序和锯齿下一层开始的节点顺序是相反的。
count=0
if not root:
return []
tr=[root]
tv=[]
av=[]
while tr:
ind=count%2
nr=[]
for i in tr:
if ind:#每层right,left开始不一样
if i.right:
nr.append(i.right)
if i.left:
nr.append(i.left)
else:
if i.left:
nr.append(i.left)
if i.right:
nr.append(i.right)
tv.append(i.val)
tr=nr[::-1]#每次取反
av.append(tv)
tv=[]
count+=1
return av
28ms,排名90%
当count=0时,看起来是先取左再取右,其实在tr=nr[::-1]这一步就把结果反过来了所以正确。
当然也可以写的更紧凑一些:用k=-k来记录因该反转的层,其实细心的朋友可以发现,上一题按层添加的时候,每层都是按顺序,只要相应的间隔取反就行了。
k=1
if not root:
return []
tr=[root]
tv=[]
av=[]
while tr:
nr=[]
for i in tr:
if i.right:
nr.append(i.right)
if i.left:
nr.append(i.left)
tv.append(i.val)
k=-k
tr=nr[:]
av.append(tv[::k])#间隔一个取反一次
tv=[]
return av
24ms,排名96%