给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
思路:这种按层次遍历的做法,需要在广度优先算法的基础上记录队列的长度。
算法步骤:
- queue不为空
- 取出queue中当前层的值,往queue中放入下一层的值
- level++
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
from collections import deque
class Solution:
def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
levels = []
if not root:
return levels
level = 0
queue = deque([root, ])
while queue:
levels.append([])
lens = len(queue)#keypoint 这里最重要,存储的是待遍历的当前层的值
for i in range(lens):#遍历queue中当前层的值
node = queue.popleft()#popleft
if level % 2 == 0:
levels[level].append(node.val)
else:
levels[level].insert(0, node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
level += 1#遍历完level层的值,level++
return levels
a = TreeNode(3)
b = TreeNode(9)
c = TreeNode(20)
d = TreeNode(15)
e = TreeNode(7)
a.left = b
a.right = c
c.left = d
c.right = e
print(Solution().zigzagLevelOrder(a))