leetcode102. 二叉树的层序遍历 BFS解决

Topic

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

示例:

二叉树:[3,9,20,null,null,15,7],
3
/
9 20
/
15 7

返回其层序遍历结果:

[
[3],
[9,20],
[15,7]
]

Solution

虽然每日一题是103,但102题是103题的基础
所以先解决102题
想查看103题点这里103. 二叉树的锯齿形层序遍历

又是令人心旷神怡的二叉树

首先判断给定的二叉树根不为空,若空则返回空
建立返回的节点值列表为ans

本题可以运用广度优先算法解决
(后来看大佬们都用collections的双端队列解决,直接用列表的pop(0)也行)
(听大佬说collections的方法更好,那就两种都用一遍)

将二叉树的根节点放在a中
由于本题遍历后的结果是列表套列表的形式,所以在ans中要加入的元素是以列表b为形式的
以a存在为条件进行按层序遍历

对于单层遍历:

按照从左至右的顺序一一判断
先将当前节点判断出为node
同时将当前节点值加入b中

对于当前此节点

如果在下一层存在左子节点则把左子节点加入a中
如果在下一层存在右子节点则把右字节点加入a中
判断完成后对同层其他的节点进行判断
二叉树判断

最后按照每层一个列表为新元素
每层的值b加入结果ans中
并在下一层遍历时清空列表b

Code_1

列表判断方法

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:

        if not root:
            return []
        ans = []
        a = [root]

        while a:
            n = len(a)
            b = []
            
            for i in range(n):
                node = a.pop(0)
                b.append(node.val)

                if node.left:
                    a.append(node.left)
                if node.right:
                    a.append(node.right)
            ans.append(b)
        
        return ans

Code_2

collections方法

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        ans = []
        a = collections.deque()
        a.append(root)

        while a:
            n = len(a)
            b = []
            
            for i in range(n):
                node = a.popleft()
                b.append(node.val)
                if node.left:
                    a.append(node.left)
                if node.right:
                    a.append(node.right)
            ans.append(b)
        
        return ans

Result

最终结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值