103. 二叉树的锯齿形层序遍历
题目描述:
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
解题
一、分析题目——广度优先搜素的变体
题目本质上就是考察广度优先搜素,只不过在其中加入了“锯齿形遍历”的元素
二、搭建广度优先搜索的框架
1.准备
1、队列queue(存储节点)
2、列表lst(存放遍历结果)
2.结构
每一层是一个循环(for)
遍历每一层构成一个大循环(while)
1、计算该层节点数size,从queue中取出该层节点(for)
大循环在queue为空时终止
2、根据实际情况处理节点
3、判断结果是否满足(满足则输出)
4、将不满足的结果加入加入queue,成为下一层的节点
3、具体处理
(1)我们只需要最后遍历的结果,所以不存在对节点的处理和对处理结果的判断
(2)遍历的方式(锯齿)决定了
1.队列queue应当有左右弹出的性质
2.应当具有表示奇偶层的元素以及响应的更新措施
3.答案的输出形式使得lst应当分化为每一层的level_lst和最终的ans
(3)特殊情况
当第一个节点为空时,返回空列表
三、码代码
# 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: TreeNode) -> List[List[int]]:
1、特殊情况
if not root:
return []
2、queue 队列先存入根节点
queue = deque()
queue.append(root)
3、准备1(标识元素)
# 用来标记当前层是偶数层还是奇数层
is_even_level = True
# 结果列表
ans = []
3、大循环(在queue为空时终止)
while queue:
4、准备2(level_lst,size)
level_lst = deque()
size = len(queue)
5、小循环
for _ in range(size):
6、锯齿遍历
偶数层,将节点值插入到 level_queue 尾部
奇数层,将节点值插入到 level_queue 头部
node = queue.popleft()
if is_even_level:
level_lst.append(node.val)
else:
level_lst.appendleft(node.val)
7、存放下一层节点
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
9、添加结果,更新标识元素,返回结果
ans.append(list(level_lst))
is_even_level = not is_even_level
return ans
四、完整代码
# 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: TreeNode) -> List[List[int]]:
if not root:
return []
queue = deque()
queue.append(root)
is_even_level = True
ans = []
while queue:
level_lst = deque()
size = len(queue)
for _ in range(size):
node = queue.popleft()
if is_even_level:
level_lst.append(node.val)
else:
level_lst.appendleft(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
ans.append(list(level_lst))
is_even_level = not is_even_level
return ans