107. 二叉树的层次遍历 II

107. 二叉树的层次遍历 II

题意

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)。node

解题思路

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

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

实现

class Solution(object):
   def levelOrderBottom(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[0].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.insert(0, [])
       return result

   def levelOrderBottom(self, root):
       """
      递归实现
      :type root: TreeNode
      :rtype: List[List[int]]
      """
       if not root:
           return []

       def helper(node, depth, res):
           """
          利用前序遍历的思想
          """
           if not node:
               return
           # 超出递归的长度代表是新的一层,则新添加数组
           if depth < 0 and abs(depth) > len(res):
               res.insert(0, [])
           # 能够理解成每一个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)
       
       result = []
       # 从-1开始是为了能够在第一次定位具体子数组的时候使用
       helper(root, -1, result)
       return result