*层序遍历(二叉树的广度优先搜索,对应10道题)
102.二叉树的层序遍历(opens new window)
107.二叉树的层次遍历II(opens new window)
199.二叉树的右视图(opens new window)
637.二叉树的层平均值(opens new window)斜体样式
429.N叉树的层序遍历(opens new window)
515.在每个树行中找最大值(opens new window)
116.填充每个节点的下一个右侧节点指针(opens new window)
117.填充每个节点的下一个右侧节点指针II(opens new window)
104.二叉树的最大深度(opens new window)
111.二叉树的最小深度
- 考点
- 队列
- 我的思路
- 和视频讲解思路一致
- 视频讲解关键点总结
- 利用队列实现二叉树层序遍历(因为直接利用二叉树数据结构无法实现逐层遍历,同时层序遍历要求先查询的元素先处理,因此使用队列)
- 两层嵌套循环,初始将根节点加入队列
- 外层循环判断队列是否为空(每次外层循环遍历当前层节点,同时查询所有下一层节点)
- 在循环的开始记录队列的初始长度,代表当前层的节点数量
- 开始内层循环,循环次数即为当前层节点数量
- 循环开始,从队列中取顶层元素,将其加入最终的结果列表
- 判断该元素(节点)是否有左右子节点,若有,加入队列
- 进行下一次循环
- 返回最终结果
- 我的思路的问题
- 无
- 代码书写问题
- python里的queue.Queue对象不能直接作为循环的判断条件,其不支持布尔值测试,因为该类里没有进行布尔值转换的方法,因此当使用其作为判断条件时,由于该对象始终是一个对象,即条件为True,将发生无限循环(合理的方式是使用其empty方法来作为判断条件)
- 可执行代码
# 102.二叉树的层序遍历(opens new window)
class Solution:def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:if root is None:return []my_queue = queue.Queue()my_queue.put(root)result = []while not my_queue.empty():size = my_queue.qsize()level = []while size:size -= 1cur = my_queue.get()level.append(cur.val)if cur.left:my_queue.put(cur.left)if cur.right:my_queue.put(cur.right)result.append(level)return result
# 107.二叉树的层次遍历II(opens new window)
# 题目要求逆序层次遍历,此时相较于102题的代码,只需要额外在输出之前调用列表的reverse函数逆序返回或[::-1]进行逆序切片即可
*226.翻转二叉树
题目链接/文章讲解/视频讲解:https://programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html
- 考点
- 二叉树遍历+变量交换
- 我的思路
- 无
- 视频讲解关键点总结
- 在遍历的基础上进行变量交换
- 我的思路的问题
- 无
- 代码书写问题
- 无
- 可执行代码
# 二叉树深度优先前序遍历(递归)+变量交换
class Solution:def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:if root is None:return rootroot.left, root.right = root.right, root.leftself.invertTree(root.left)self.invertTree(root.right)return root
101.对称二叉树(先过年休息,年后再补上)
题目链接/文章讲解/视频讲解:https://programmercarl.com/0101.%E5%AF%B9%E7%A7%B0%E4%BA%8C%E5%8F%89%E6%A0%91.html