给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回锯齿形层次遍历如下:
[ [3], [20,9], [15,7] ]
解题思路: 锯齿形层次遍历,又不单单是层次遍历,一次从左到右,一次从右向左。
先看一下二叉树的层次遍历(即逐层地从左向右访问所有节点),给定的二叉树的层次遍历结果为:
[ [3], [9,20], [15,7] ]
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if root is None:
return []
cur=[root]
results=[]
while cur:
temp=[]
val=[]
for i in cur:
if i.left is not None:
temp.append(i.left)
if i.right is not None:
temp.append(i.right)
val+=[i.val]#val数组存放每层的元素
cur=temp
results.append(val)
return results
如何改进代码,使一层从左到右遍历,一层从右往左遍历,交替进行:
考虑记录树的深度,当深度为偶数时,存放每层元素的数组逆序;当深度为奇数时,存放每层元素的数组正序;
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def zigzagLevelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if root is None:
return []
cur=[root]
results=[]
length=0
while cur:
temp=[]
val=[]
for i in cur:
if i.left is not None:
temp.append(i.left)
if i.right is not None:
temp.append(i.right)
val+=[i.val]
length+=1
cur=temp
if(length%2!=0):
results.append(val)
else:
results.append(val[::-1])
return results