二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
思路:
层序遍历是我学习宽度优先搜索时掌握得最得心应手的一套小连招了~我总体来说,们只需要定义一个队列,后续要做的就是把二叉树的每一层逐一放入这个队列中就好了。
这道题直接看代码吧,非常加单明了,如果看得懂就不需要再看小结部分(我自己都觉得有点啰嗦了)。
代码:
class Solution(object):
def levelOrder(self, root):
if not root:#处理特殊情况
return []
q= [root]#一开始把根节点放入列表,根节点自己就是一层
res=[]
while q:#当队列不为空就一直进行for循环
re =[]#存放单层结果的res列表
for i in range(len(q)):#遍历当前q的长度,有多长下面就出队列几个
qq = q.pop(0)
re.append(qq.val)#将出队列的元素存入结果列表
if qq.left:#如果这个元素有左右子节点,就继续放入队列,下次for循环时出队列
q.append(qq.left)
if qq.right:
q.append(qq.right)
res.append(re)#把当前层的结果列表添加入总结果
return res
小结:
由代码可知,我们使用队列q逐一存放各个层的元素。我们只需要保证每次放入下一层之前,要先清空上一层(同时把清空的上一层存入结果)。
具体来看,一开始我们把根节点单独放进这个队列q中。然后有一个很关键的操作:for i in range(len(q)): qq = q.pop(0), 在这里我们要得到当前队列的长度,因为队列长度就是这一层的元素个数,这样可以保证我们弹出的元素(也是存入结果的元素)正好就是这一层的元素个数。对于弹出的元素,再把他们的左右节点(如果有)添加进队列,但不用担心新添加的下一层节点会被弹出,因为我们弹出的个数已经做了限制就是一开始len(q)。等for循环结束之后,队列里又充满了下一层的所有元素,再次开启for循环,直到最后队列中所有元素都被弹出,且这些元素不再有子节点添加到队列中,遍历就停止了。
整个过程当中,每一个for循环我们就得到一个结果列表,最终组成我们的遍历结果。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了