102. 二叉树的层次遍历
题意
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
解题思路
递归:利用前序遍历的思想,在递归过程中记录下结点的深度,在对应深度将结点加入到结果中;
迭代:使用两个队列是因为一个用于记录当前层的结点,另外一个则记录下一层的结点,用于后面和当前队列进行替换;
实现
class Solution(object):
def levelOrder(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[-1].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.append([])
return result
def levelOrder(self, root):
"""
递归实现
执行用时 : 36 ms, 在Binary Tree Level Order Traversal的Python提交中击败了39.42% 的用户
内存消耗 : 12.6 MB, 在Binary Tree Level Order Traversal的Python提交中击败了0.82% 的用户
:type root: TreeNode
:rtype: List[List[int]]
"""
result = []
if not root:
return result
def helper(node, depth, res):
"""
利用前序遍历的思想
"""
if not node:
return
# 超出递归的长度表明是新的一层,则新添加数组
if depth >= len(res):
res.append([])
# 可以理解成每个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)
helper(root, 0, result)
return result