103. 二叉树的锯齿形层序遍历(广度优先搜索)(傻瓜教程)(python)(LC)

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


链接: 广度优先搜索的框架

你可能感兴趣的:(傻瓜教程(LC),二叉树,数据结构,算法,python,队列)