給定一個二叉樹,返回其節點值自底向上的層次遍歷。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)。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