层序遍历
给定一个二叉树,返回其按层序遍历得到的节点值。 层序遍历即逐层地、从左到右访问所有结点。
什么是层序遍历呢?简单来说,层序遍历就是把二叉树分层,然后每一层从左到右遍历:
具体求解可以使用BFS遍历框架:
def bfs(root):
que = collections.deque([])
if root:
que.append(root)
result = []
while (que):
node = que.popleft()
result.append(node.val)
if (node.left != None):
que.append(node.left)
if (node.right != None):
que.append(node.right)
细微的区别在于,BFS遍历结果为一维数组,而层序遍历结果为二维数组。在遍历过程中我们无法区分队列中的结点来自哪一层。
因此,我们需要稍微修改一下代码,在每一层遍历开始前,先记录队列中的结点数量 n(也就是这一层的结点数量),然后一口气处理完这一层的 n 个结点。具体我们通过具体实例进行展示。
102. 二叉树的层序遍历
解法:广度优先遍历(BFS)
import collections
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
que = collections.deque([])
if root:
que.append(root)
result = []
while que:
temp = []
n = len(que)
# 相较于BFS遍历框架,层序遍历修改处
for _ in range(n):
node = que.popleft()
temp.append(node.val)
if node.left:
que.append(node.left)
if node.right:
que.append(node.right)
result.append(temp)
return result
2016. 增量元素之间的最大差值
解法:后缀最大值法
官方思路的逆向思维。
class Solution:
def maximumDifference(self, nums: List[int]) -> int:
result = -1
max_val = nums[-1]
for i in range(len(nums)-2, -1, -1):
if nums[i] < max_val:
result = max(max_val-nums[i], result)
else:
max_val = nums[i]
return result