LeetCode 热题 HOT 100 第三十八天 102. 二叉树的层序遍历 中等题 用python3求解

题目地址

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

示例 1:
在这里插入图片描述
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:
输入:root = [1]
输出:[[1]]

示例 3:
输入:root = []
输出:[]

提示:
树中节点数目在范围 [0, 2000] 内
-1000 <= Node.val <= 1000

在这里插入图片描述
两种解法:
1.迭代法(广度优先遍历)
2.递归法(深度优先遍历)

广度优先遍历是按层层推进的方式,遍历每一层的节点。题目要求的是返回每一层的节点值,所以这题用广度优先来做非常合适。
如果想要扩展递归法,指路–>迭代+递归 多图演示 102.二叉树的层次遍历

本人比较懒,每题只掌握一种方法,苟过面试就好。

思路:
广度优先需要用队列作为辅助结构,我们先将根节点放到队列中,然后不断遍历队列。
在这里插入图片描述
首先拿出根节点,如果左子树/右子树不为空,就将他们放入队列中。第一遍处理完后,根节点已经从队列中拿走了,而根节点的两个孩子已放入队列中了,现在队列中就有两个节点 2 和 5。
在这里插入图片描述
第二次处理,会将 2 和 5 这两个节点从队列中拿走,然后再将 2 和 5 的子节点放入队列中,现在队列中就有三个节点 3,4,6。
在这里插入图片描述
我们把每层遍历到的节点都放入到一个结果集中,最后返回这个结果集就可以了。
时间复杂度: O(n)O(n)
空间复杂度:O(n)O(n)

代码实现:

class Solution(object):
	def levelOrder(self, root):
		"""
		:type root: TreeNode
		:rtype: List[List[int]]
		"""
		if not root:
			return []
		res = []
		queue = [root] # queue存储了root的根节点
		while queue:
			# 获取当前队列的长度,这个长度相当于 当前这一层的节点个数
			size = len(queue)
			tmp = [] # 每一次while循环把tmp清空一遍
			# 将队列中的元素都拿出来(也就是获取这一层的节点),放到临时list中
			# 如果节点的左/右子树不为空,也放入队列中
			for i in range(size):
				r = queue.pop(0)
				tmp.append(r.val)
				if r.left:
					queue.append(r.left)
				if r.right:
					queue.append(r.right)
			# 将临时list加入最终返回结果中
			res.append(tmp)
		return res

注意:这里的queue和r存储的是树节点。tmp是普普通通的数组。
把变量print一下就知道内部是怎么变化的了:

class Solution(object):
	def levelOrder(self, root):
		"""
		:type root: TreeNode
		:rtype: List[List[int]]
		"""
		if not root:
			return []
		res = []
		queue = [root] # queue存储了root的根节点
		while queue:      
			# 获取当前队列的长度,这个长度相当于 当前这一层的节点个数
			size = len(queue)
			print('size:',size)
			print('queue1:',queue)
			tmp = [] # 每一次while循环把tmp清空一遍
			# 将队列中的元素都拿出来(也就是获取这一层的节点),放到临时list中
			# 如果节点的左/右子树不为空,也放入队列中
			for i in range(size):
				print('i:',i)
				r = queue.pop(0)
				tmp.append(r.val)
				print('r:',r)
				print('tmp:',tmp)
				if r.left:
					queue.append(r.left)
					print('queue2:',queue)
				if r.right:
					queue.append(r.right)
					print('queue3:',queue)
			# 将临时list加入最终返回结果中
			res.append(tmp)
			print('res:',res)
		return res

print的结果:
size: 1
queue1: [TreeNode{val: 3, left: TreeNode{val: 9, left: None, right: None}, right: TreeNode{val: 20, left: TreeNode{val: 15, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}}]
i: 0
r: TreeNode{val: 3, left: TreeNode{val: 9, left: None, right: None}, right: TreeNode{val: 20, left: TreeNode{val: 15, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}}
tmp: [3]
queue2: [TreeNode{val: 9, left: None, right: None}]
queue3: [TreeNode{val: 9, left: None, right: None}, TreeNode{val: 20, left: TreeNode{val: 15, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}]
res: [[3]]

size: 2
queue1: [TreeNode{val: 9, left: None, right: None}, TreeNode{val: 20, left: TreeNode{val: 15, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}]

i: 0
r: TreeNode{val: 9, left: None, right: None}
tmp: [9]

i: 1
r: TreeNode{val: 20, left: TreeNode{val: 15, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}
tmp: [9, 20]
queue2: [TreeNode{val: 15, left: None, right: None}]
queue3: [TreeNode{val: 15, left: None, right: None}, TreeNode{val: 7, left: None, right: None}]
res: [[3], [9, 20]]

size: 2
queue1: [TreeNode{val: 15, left: None, right: None}, TreeNode{val: 7, left: None, right: None}]

i: 0
r: TreeNode{val: 15, left: None, right: None}
tmp: [15]

i: 1
r: TreeNode{val: 7, left: None, right: None}
tmp: [15, 7]
res: [[3], [9, 20], [15, 7]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值