二叉树的层序遍历
方法:借用队列实现
队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
LeetCode:102 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的层序遍历 。 (即逐层地,从左到右访问所有节点)。
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
为了正确输出二叉树的层序遍历,我们需要对结果进行分层处理。一种常见的做法是在每一层遍历开始之前,记录当前队列的长度,这个长度表示当前层的节点个数。然后,循环遍历这个长度次数,依次将每个节点的值加入当前层的列表中,并将其非空子节点加入队列中。
这样,我们就可以实现二叉树的层序遍历,并按照每层生成一个子列表。
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:
return []
quene = [root] # 创建队列,并将根节点加入队列中
result = [] # 结果列表
while quene:
level_nodes = [] # 记录当前层的节点值
level_size = len(quene) # 当前层的节点个数
for _ in range(level_size):
node = quene.pop(0) # 取出队列的头节点
if node:
level_nodes.append(node.val) # 将节点值加入当前层的列表中
if node.left:
quene.append(node.left) # 如果存在左子节点,将其加入队列中
if node.right:
quene.append(node.right) # 如果存在右子节点,将其加入队列中
result.append(level_nodes)
return result
LeetCode:107 二叉树的层序遍历 II
给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]
要实现二叉树的自底向上层序遍历,我们可以按照自顶向下层序遍历的方法先获取每一层的节点值,然后反转结果列表即可。
class Solution:
def levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:
return []
quene = [root] # 创建队列,并将根节点加入队列中
result = [] # 结果列表
while quene:
level_nodes = [] # 记录当前层的节点值
level_size = len(quene) # 当前层的节点个数
for _ in range(level_size):
node = quene.pop(0) # 取出队列的头节点
if node:
level_nodes.append(node.val) # 将节点值加入当前层的列表中
if node.left:
quene.append(node.left)
if node.right:
quene.append(node.right)
result.insert(0,level_nodes) # 将当前层的节点值插入到结果列表的开头
return result