107. Binary Tree Level Order Traversal II

problem

Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).

For example:
Given binary tree [3,9,20,null,null,15,7],
    3
   / \
  9  20
    /  \
   15   7
return its bottom-up level order traversal as:
[
  [15,7],
  [9,20],
  [3]
]

solution

  • 思路1 ,和257. Binary Tree Paths解法类似;引入一个层深变量,按层深进行储存;存储对象对递归函数来说要全局,,先写出来看看 ;
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def __init__(self):
        self.rList =[]
        
    def levelOrderBottom(self, root,deep=0):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if root:
            if len(self.rList) <= deep:
                self.rList.append([])
            self.rList[deep].append(root.val)
            if root.left:
                self.levelOrderBottom(root.left,deep+1)
            if root.right:
                self.levelOrderBottom(root.right,deep+1)
            return self.rList[::-1]
        else:
            return []

discuss

  • 压栈的思路就是带层深放进去,pop处理,将处理结果放进去,以此循环
def dfs(self, root, level, res):
    if root:
        if len(res) < level + 1:
            res.insert(0, [])
        res[-(level+1)].append(root.val)
        self.dfs(root.left, level+1, res)
        self.dfs(root.right, level+1, res)
        
# dfs + stack
def levelOrderBottom2(self, root):
    stack = [(root, 0)]
    res = []
    while stack:
        node, level = stack.pop()
        if node:
            if len(res) < level+1:
                res.insert(0, [])
            res[-(level+1)].append(node.val)
            stack.append((node.right, level+1))
            stack.append((node.left, level+1))
    return res
 
# bfs + queue   
def levelOrderBottom(self, root):
    queue, res = collections.deque([(root, 0)]), []
    while queue:
        node, level = queue.popleft()
        if node:
            if len(res) < level+1:
                res.insert(0, [])
            res[-(level+1)].append(node.val)
            queue.append((node.left, level+1))
            queue.append((node.right, level+1))
    return res
posted @ 2016-10-15 15:36  Salmd  阅读(145)  评论(0)    收藏  举报