zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【二叉树】LeetCode 102. 二叉树的层序遍历【中等】

LeetCode二叉树遍历 中等 层序 102
2023-09-14 08:59:35 时间

给你二叉树的根节点 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

分析

方法一:迭代实现

广度优先遍历是按照层层推进的方式,遍历每一层的节点。题目要求的是返回每一层的节点值,所以这道题非常适合用广度优先来做。

广度优先需要用队列作为辅助结构,我们先将根结点放到队列中,然后不断遍历队列。

首先拿出根节点,如果左子树/右子树不为空,就将他们也都放入队列中。第一遍处理完后,根节点已经从队列中拿走了,而根节点的两个孩子已放入队列中,现在队列中就有了两个节点2和5。

第二层处理会将2和5这两个节点从队列中拿走,然后再将2和5的子节点放入队列中,现在队列中就有三个节点3,4,6。

我们把每一层遍历到的节点都放入到一个结果集中,最后返回这个结果就可以了。

时间复杂度:O(n) 

空间复杂度:O(n)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        
        res = []
        queue = [root]
        while queue:
            # 获取当前队列的长度,这个长度相当于当前这一层的节点个数
            size = len(queue)
            tmp = [] # 定义临时列表,用于

            # 将队列中的元素都拿出来(也就是获取这一层的节点),放到临时list中
            # 如果节点的左子树/右子树不为空,也放入队列中
            for _ 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)
            # 将临时列表tmp加入最终的返回结果中
            res.append(tmp)
        
        return res

方法二:递归实现

用广度优先处理是很直观的,可以想象成是一把刀横着切割了树的每一层。

但是深度优先遍历就不那么直观了。我们开下脑洞,把二叉树的样子调整一下,摆成一个田字形的样子。田字形的每一层就对应一个list。

 

按照深度优先的处理顺序,会先访问节点1,再访问节点2,接着是节点3。

之后是第二列的节点4,5。最后是第三列的节点6。

每次递归的时候都需要带一个index(表示当前的层数),也就对应那个田字格子中的第几行,如果当前行对应的list不存在,就加入一个空list进去

时间复杂度:O(n)

空间复杂度:O(h), h为树高度。

class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if not root:
            return []
        res = []
        def dfs(index,r):
            # 假设res是[ [1],[2,3] ], index是3,就再插入一个空list放到res中
            if len(res)<index:
                res.append([])
            #  将当前节点的值加入到res中,index代表当前层,假设index是3,节点值是99
            # res是[ [1],[2,3] [4] ],加入后res就变为 [ [1],[2,3] [4,99] ]
            res[index-1].append(r.val)
            # 递归的处理左子树,右子树,同时将层数index+1
            if r.left:
                dfs(index+1,r.left)
            if r.right:
                dfs(index+1,r.right)
        dfs(1,root)
        return res