leetcode 第102题 二叉树的层次遍历, 第103题二叉树的锯齿形层次遍历, 第107题 二叉树的层次遍历 II

leetcode 第102题 二叉树的层次遍历, 第103题二叉树的锯齿形层次遍历, 第107题 二叉树的层次遍历 II

问题分析

这三道题都考察的都是二叉树的广度优先遍历,二叉树的广度优先遍历非常明显,就是按照顺序输出每一层的节点。这三题都是一个套路,同一种方法只要做一点修改就行了。

102 题 二叉树的层次遍历

这一题是为了按照顺序输出给定二叉树的每一层节点的值,其中每一层的值作为一个数组。具体题目见下:
在这里插入图片描述
解法是先用一个列表temp保存根节点,然后循环判断temp是否为空。如果不为空,就先将temp中节点的值全部加入到返回数组中。接下来就开始遍历该列表,如果列表的左右节点存在,就加入新生成的子节点列表中,这样遍历后,将子节点列表赋值为temp,接着循环。
这种解法并没有使用递归,所以要快一点。

103题 二叉树的锯齿形层次遍历

该题和102题比较相似,就是从上到下按层输出节点的值,但不同的是每层输出的值顺序不一样。
在这里插入图片描述
这一题针对102题的解法只要做一点改动就好了,上题中在加入每一层节点值的时候,要注意加入的顺序,即是顺序加入还是倒序加入。

107题 二叉树的层次遍历 II

107题的输出和102题的正好相反,所以直接将102题的结果逆序输出即满足题意。
在这里插入图片描述
但是我写了另外一种解法,是使用递归来解题。即先设置数组temp=[root],然后写递归函数来遍历temp,如果temp中的节点由左右儿子,那么加入新的数组。这样遍历结束后,判断儿子节点数组是否包含元素,如果有,那么将儿子数组代入递归函数中,继续递归。如果没有,说明当前数组已经是叶子节点了,那么将数组所有节点的值加入返回数组,并退出当前函数 ,返回上层函数。

源码

102 题 二叉树的层次遍历

class Solution:
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        ret = []
        if not root:
            return ret
        temp = [root]
        while temp:
            son = []
            ret.append([node.val for node in temp])
            for node in temp:
                if node.left:
                    son.append(node.left)
                if node.right:
                    son.append(node.right)
            temp = son
        return ret

103题 二叉树的锯齿形层次遍历

class Solution:
    def zigzagLevelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        ret = []
        if not root:
            return ret
        flag = True
        nodeList = [root]
        while nodeList:
            temp = []
            if flag:
                ret.append([node.val for node in nodeList])
            else:
                ret.append([node.val for node in nodeList[::-1]])
            for node in nodeList:
                if node.left:
                    temp.append(node.left)
                if node.right:
                    temp.append(node.right)
            nodeList = temp
            flag = not flag
        return ret

107题 二叉树的层次遍历 II

class Solution:
    def levelOrderBottom(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        ret = []

        # 这里使用广度优先遍历并加上头递归(先递归,后操作)
        def bfs(level):
            son = []
            for node in level:
                if node.left:
                    son.append(node.left)
                if node.right:
                    son.append(node.right)
            if son:
                bfs(son)
            ret.append([node.val for node in level])
            return

        if root:
            bfs([root])
        return ret

靴靴

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值