• 102. 二叉树的层次遍历


    问题描述

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

    例如:
    给定二叉树: [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7
    

    返回其层次遍历结果:

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

    解决方案

    • queue的概念用deque来实现,popleft() 时间复杂为O(1)即可。

    • 外围的While用来定义BFS的终止条件,所以我们最开始initialize queue的时候可以直接把root放进去。

    • 在每层的时候,通过一个cur_level记录当前层的node.val,size用来记录queue的在增加子孙node之前大小,因为之后我们会实时更新queue的大小。

    • 当每次从queue中pop出来的节点,把它的左右子节点放进Queue以后,记得把节点本身的的value放进cur_level

    • for loop终止后,就可以把记录好的整层的数值,放入我们的return数组里。

    时间复杂度:O(n)

    show me the code

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
            from collections import deque
            if not root: return []
            queue, res = deque([root]), []
            
            while queue:
                cur_level, size = [], len(queue)
                for i in range(size):
                    node = queue.popleft()
                    if node.left:
                        queue.append(node.left)
                    if node.right:
                        queue.append(node.right)
                    cur_level.append(node.val)
                res.append(cur_level)
            return res
    

    这里再介绍一种不依赖于queue的解法

    class Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
            if not root:
                return []
            res,level = [],[root]
            while level:
                res.append([node.val for node in level])
                temp = []
                for node in level:
                    temp.extend([node.left,node.right])
                level = [leaf for leaf in temp if leaf]
            return res
    

    这样看起来更加优雅一些,但是牺牲了一些性能

  • 相关阅读:
    11g 配置 dgmgrl 以及报错 DataGuard ORA-00313,
    java三种匿名的方式开启线程
    java 四种方式实现字符流文件的拷贝对比
    java中过滤查询文件
    通过Java实现斗地主
    java中Map的entrySet 和keySet的使用
    python3列表推导式和生成器。
    python的特殊方法总结
    python3 定义向量运算
    python3模拟扑克牌
  • 原文地址:https://www.cnblogs.com/huang-yc/p/10685719.html
Copyright © 2020-2023  润新知