题目:给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节
点所在的层,逐层从左向右遍历)
解法一:层次遍历+结果反转
102题--层次遍历中的结果是top → bottom 保存结果,此题完全可以套用102题的程序(递归法 or 迭代法),最后将结果反转即可。
解法二:DFS递归法+双端队列
在102题递归解法基础上,采样队列代替列表,每次插入新的层时,在左侧插入即可。这样就形成bottom → top 的层次遍历结果。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
from collections import deque
class Solution:
def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
res = deque()
def levelOrder(node, level):
if len(res) == level and node:
res.appendleft([])
if node:
res[-level-1].append(node.val)
levelOrder(node.left, level+1)
levelOrder(node.right, level+1)
levelOrder(root, 0)
return res
执行结果:通过显示详情
执行用时 :32 ms, 在所有 python3 提交中击败了98.81%的用户
内存消耗 :13.1 MB, 在所有 python3 提交中击败了97.60%的用户
解法二----变体:
递归时,从上到下递归; 添加值时,从下向上添加,看代码:
此时无需用双端队列,用列表也行,不过用列表是,添加空列表时仍要在左边添加,否则出错
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
from collections import deque
class Solution:
def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
res = deque()
def levelOrder(node, level):
if len(res) == level and node:
res.appendleft([])
if node:
levelOrder(node.left, level+1)
levelOrder(node.right, level+1)
res[-level-1].append(node.val)
levelOrder(root, 0)
return res
执行结果:通过显示详情
执行用时 :44 ms, 在所有 python3 提交中击败了74.87%的用户
内存消耗 :14.9 MB, 在所有 python3 提交中击败了5.17%的用户
列表:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
from collections import deque
class Solution:
def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
res = []
def levelOrder(node, level):
nonlocal res
if len(res) == level and node:
res = [[], *res] #在左边添加空列表,否则会出现错误。因为level是从右往左增加的,
#如果直接append空列表,会造成列表层数混乱。
if node:
levelOrder(node.left, level+1)
levelOrder(node.right, level+1)
res[-level-1].append(node.val)
# else:
# return None
levelOrder(root, 0)
return res
执行结果:通过显示详情
执行用时 :32 ms, 在所有 python3 提交中击败了98.81%的用户
内存消耗 :13.4 MB, 在所有 python3 提交中击败了41.88%的用户
解法三:BFS迭代
和102题的迭代法相同,只不过在添加空列表时,改成在头部添加即可。