1. 回顾数据结构&算法

让我们重新回顾一下数据结构的整体分类和算法,并自己内心说明各个数据结构的特性,回忆算法的思想和代码模板。

1.1 一维数据结构

基础的有:数组(查询快,插入操作较慢,需要重新分配空间)、链表(查询慢,插入比数组快)
高级的有:栈stack(先进后出)、队列queue(先进先出)、双端队列deque(适用于FIFO和LIFO两个场景)、集合Set(无重复元素集合)、映射map(hash 或者 map)、etc

1.2 二维数据结构

基础的有:树tree、图Graph(链表是特殊化的树,树是特殊化的图)
高级的有:二叉搜索树binary search tree (red-black tree,AVL)、堆heap、并查集disjoint Set、字典树 Trie、etc

1.3 特殊

位运算 bitwise、布隆过滤器 BloomFilter
LRU Cache
注意:在脑海中回忆数据结构的特点

1.4 算法

  • if-else,switch ——> branch
  • for,while loop ——> Iteration
  • 递归 Recursion(Divide & Conquer,backtrace)
  • 搜索Search:深度优先搜索 Depth first Search, 广度优先搜索Breadth first search , A*,etc
  • 动态规划 Dynamic Programming
  • 二分查找 binary Search
  • 贪心算法 Greedy
  • 数学 Math,几何 Geometry

注意:在脑海中回忆上面的各种算法思想和代码模板

默写上一章节中:树的定义和遍历模板,分治和回溯的代码模板
注意:递归、分治、回溯三个算法的异同点。
回顾完成后我们开始学习深度优先搜索和广度优先搜索这两个算法

2.深度优先搜索算法

首先遍历搜索指在图(状态集)或树中寻找特定节点,回忆树的定义和遍历代码模板
特点:

  • 每个节点都要访问一次
  • 每个节点只访问一次
  • 对节点的访问顺序不同分为dfs和bfs

**

2.1 遍历顺序

image.png

2.2 dfs代码模板**

dfs-递归版本

  1. visited = set()
  2. def dfs(node, visited):
  3. if node in visited: # terminator
  4. # already visited
  5. return
  6. visited.add(node)
  7. # process current node here.
  8. ...
  9. for next_node in node.children():
  10. if not next_node in visited:
  11. dfs(next node, visited)

dfs-非递归写法

  1. def DFS(self, tree):
  2. if tree.root is None:
  3. return []
  4. visited, stack = [], [tree.root]
  5. while stack:
  6. node = stack.pop()
  7. visited.add(node)
  8. process (node)
  9. nodes = generate_related_nodes(node)
  10. stack.push(nodes)
  11. # other processing work
  12. ...

3. 广度优先搜索算法

3.1 遍历顺序

image.png

3.2 广度优先搜索算法-bfs代码模板

bfs非递归代码模板:

  1. def BFS(graph, start, end):
  2. queue = []
  3. queue.append([start])
  4. visited.add(start)
  5. while queue:
  6. node = queue.pop()
  7. visited.add(node)
  8. process(node)
  9. nodes = generate_related_nodes(node)
  10. queue.push(nodes)

bfs递归代码模板:

visited = set()
def dfs(node, visited):
    visited.add(node)
    # process current node here.
    ...
    for next_node in node.children():
        if not next_node in visited:
            dfs(next node, visited)

4. 练习

  1. https://leetcode-cn.com/problems/binary-tree-level-order-traversal/#/description
    2. https://leetcode-cn.com/problems/minimum-genetic-mutation/#/description
    3. https://leetcode-cn.com/problems/generate-parentheses/#/description
    4. https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/#/description

HomeWork
1. https://leetcode-cn.com/problems/word-ladder/description/
2.https://leetcode-cn.com/problems/word-ladder-ii/description/
3.https://leetcode-cn.com/problems/number-of-islands/
4.https://leetcode-cn.com/problems/minesweeper/description/