1. 题目
实战题目
二叉树层级遍历102
最小基因变化433
括号生成22
每一层当中的最大节点515
课后作业
127 单词接龙
126 单词接龙2
岛屿的数量200
529 扫雷游戏 529
2. dfs遍历
感觉dfs一般用于路径型问题求解,就是每个答案需要很多步完成,这种答案的个数是多少,就像是回溯遍历一样, 而深度优先则更倾向于快速到达某个位置的方法。
1. 递归写法
visited = set()
def dfs(node, visited):
if node in visited: # terminator
# already visited
return
visited.add(node)
# process current node here.
...
for next_node in node.children():
if next_node not in visited:
dfs(next_node, visited)
2. 非递归写法
借助一个stack
def DFS(self, root):
if tree.root is None:
return []
visited, stack = [], [root]
while stack:
node = stack.pop()
visited.add(node)
process (node)
# 生成相关的节点
nodes = generate_related_nodes(node)
stack.push(nodes)
# other processing work
...
3. bfs代码模板
一般都是借用一个queue
# Python
def BFS(root):
visited = set()
queue = []
queue.append([root])
while queue:
node = queue.pop()
visited.add(node)
process(node)
nodes = generate_related_nodes(node)
queue.push(nodes)
# other processing work
总结
1.基因变化
在写bfs,dfs的时候一定不能忘了visited的判断,刚开始因为忘了,导致了代码死循环了,因为你的问题可能是一个类似于图的问题
2. 岛屿数量
这个在广度优先遍历的时候处理不得当,应该在加入queue之前赋值为0的,这里其实等于是共用了visited数组,所以处理也要更加小心一些
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
row_num = len(grid)
col_num = len(grid[0])
island = 0
queue = []
directions = [(0,-1),(0,1),(-1,0),(1,0)]
for row in range(row_num) :
for col in range(col_num) :
if grid[row][col] == "0":
continue
island += 1
grid[row][col] = "0" # 一开始这里没有
queue.append((row,col))
while queue:
row_p,col_p = queue.pop(0)
# grid[row_p][col_p] = "0" 最开始是只是在这里进行了赋值,导致了后面处理的时候出现了反复应该,岛屿数量变少了或者会进入死循环
for direct in directions :
row_d=row_p + direct[0]
col_d =col_p+ direct[1]
if row_d >= 0 and col_d >= 0 and row_d < row_num and col_d < col_num:
if grid[row_d][col_d] == "1" :
queue.append((row_d,col_d))
grid[row_d][col_d] = "0" # 一开始这里也没有
return island