二叉树的层序遍历

题目

给你一个二叉树,请你返回其按层序遍历得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例:
二叉树:[3,9,20,null,null,15,7],
在这里插入图片描述
返回其层序遍历结果:
在这里插入图片描述

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

套用模板

广度优先搜索

在这里插入图片描述
BFS使用队列这一数据结构,把每个还没有搜索到的点依次放入队列,然后再弹出队列的头部元素当做当前遍历点。

这里BFS总共有两个模板:

  1. 当不确定层数时:

     while queue 不空:
      cur = queue.pop()
      for 节点 in cur的所有相邻节点:
    		 if 该节点有效且未访问过:
         		queue.push(该节点)
    
  2. 需要确定层数时:
    level表示当前遍历的二叉树层(或在一个图中,当前已经走了多少步);
    size表示在当前遍历层的元素数,也就是队列中的元素数(把这些元素一次性遍历之后,即相当于当前层的所有元素都向外走了一步)。

     level = 0
     while queue 不空:
     	size = queue.size()
     	while (size --) {
     		cur = queue.pop()
     		for 节点 in cur的所有相邻节点:
         		if 该节点有效且未被访问过:
            	 		queue.push(该节点)
     	}
         level ++;
    

本题中,使用队列保存每层的所有节点,每次把队列里的原先所有节点进行出队列操作,再把每个元素的非空左右子节点进入队列。因此即可得到每层的遍历。

深度优先搜索

在这里插入图片描述
由于DFS 不是按照层次遍历,但本题需要让递归的过程中同一层的节点放到同一个列表中,于是在递归时记录每个节点的深度 level,递归到新节点将该节点放入 level 对应列表的末尾。

注:当遍历到一个新的深度 level,而最终结果 res 中还没有创建 level 对应的列表时,应该在 res 中新建一个列表用来保存该 level 的所有节点。

提交代码

广度优先搜索

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        queue = collections.deque()
        queue.append(root)
        res = []
        while queue:
            size = len(queue)
            level = []
            for _ in range(size):
                cur = queue.popleft()
                if not cur:
                    continue
                level.append(cur.val)
                queue.append(cur.left)
                queue.append(cur.right)
            if level:
                res.append(level)
        return res

深度优先搜索

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        res = []
        self.level(root, 0, res)
        return res

    def level(self, root, level, res):
        if not root: 
            return
        if len(res) == level: 
            res.append([])
        res[level].append(root.val)
        if root.left: 
            self.level(root.left, level + 1, res)
        if root.right: 
            self.level(root.right, level + 1, res)

总结

  1. 二叉树当层序遍历时为空的地方需要标注出来,反过来当给出链表还原二叉树也需要按照一定的规则输出;
  2. 用到二叉树深度和广度优先搜索方法时,套用模板,解题效果更佳。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值