zoukankan      html  css  js  c++  java
  • 102. 二叉树的层次遍历

    102. 二叉树的层次遍历

    题意

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

    解题思路

    1. 递归:利用前序遍历的思想,在递归过程中记录下结点的深度,在对应深度将结点加入到结果中;

    2. 迭代:使用两个队列是因为一个用于记录当前层的结点,另外一个则记录下一层的结点,用于后面和当前队列进行替换;

    实现

    class Solution(object):
       def levelOrder(self, root):
           """
          迭代实现
          :type root: TreeNode
          :rtype: List[List[int]]
          """
           if not root:
               return []

           # 使用两个队列是因为一个用于记录当前层的结点,另外一个则记录下一层的结点,用于后面和当前队列进行替换
           # 致于为什么要使用队列,是因为需要题目要求结点的顺序是从左到右,也就是先加入的要先取出,这是队列的特性;
           cur_level, tmp_level, result = [root], [], [[]]
           while cur_level:
               cur = cur_level.pop(0)
               result[-1].append(cur.val)
               # 替代队列加入下一层的结点
               if cur.left:
                   tmp_level.append(cur.left)
               if cur.right:
                   tmp_level.append(cur.right)
               # 是否需要添加新的一层
               if not cur_level and tmp_level:
                   cur_level = tmp_level[:]
                   tmp_level = []
                   result.append([])
           return result

       def levelOrder(self, root):
           """
          递归实现
          执行用时 : 36 ms, 在Binary Tree Level Order Traversal的Python提交中击败了39.42% 的用户
    内存消耗 : 12.6 MB, 在Binary Tree Level Order Traversal的Python提交中击败了0.82% 的用户
          :type root: TreeNode
          :rtype: List[List[int]]
          """
           result = []
           if not root:
               return result

           def helper(node, depth, res):
            """
            利用前序遍历的思想
            """
               if not node:
                   return
               # 超出递归的长度表明是新的一层,则新添加数组
               if depth >= len(res):
                   res.append([])
               # 可以理解成每个node都能对应到树的depth
               res[depth].append(node.val)
               if node.left:
                   helper(node.left, depth+1, res)
               if node.right:
                   helper(node.right, depth+1, res)

           helper(root, 0, result)
           return result
  • 相关阅读:
    Qt编程之右键单击QTreeWidgetItem弹出菜单
    Qt编程之QString 处理换行
    配置zbar识别二维码(转载)
    我学习图像处理的小结
    自己动手,实现“你的名字”滤镜
    结合grabcut和inpaint,实现人像去除
    (转载)找圆算法((HoughCircles)总结与优化
    寻找白板上的便签条
    寻找精密光学标定板上的矩形(网友提问)
    OpenCV中Denoising相关函数的简单介绍
  • 原文地址:https://www.cnblogs.com/George1994/p/10605049.html
Copyright © 2011-2022 走看看