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