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
posted @ 2019-03-27 07:58  banananana  阅读(...)  评论(... 编辑 收藏