• 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
  • 相关阅读:
    【翻译】Longest Palindromic Substring 最长回文子串
    java三大框架学习总结(1)
    select XXX into 和 Insert into XXX select
    在WinForm编程中犯的一些错误
    自定义类型数组排序的两种实现方式
    C# 释放非托管资源
    在已创建的DataTable对象中添加在首列一列
    WinForm编程时窗体设计器中ComboBox控件大小的设置
    php处理序列化jQuery serializeArray数据
    谈谈对程序员的培养
  • 原文地址:https://www.cnblogs.com/George1994/p/10605049.html
Copyright © 2020-2023  润新知