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
相關文章
相關標籤/搜索