给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)。node
递归:利用前序遍历的思想,在递归过程当中记录下结点的深度,在对应深度将结点加入到结果中;web
迭代:使用两个队列是由于一个用于记录当前层的结点,另一个则记录下一层的结点,用于后面和当前队列进行替换;数组
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