广度优先和深度优先搜索算法
本章主要讲述广度优先搜索算法BFS(Breadth First Search)和深度优先算法DFS(Depth First Search)。
- 广度优先:从起点开始由近及远进行广泛搜索,一般使用队列实现
- 深度优先:从起点开始沿着一条路径一直往下,直到不能搜索为止,再折返沿着另一条路径往下搜索,使用栈或者递归实现
下面将以上图中的树来举例实现搜索,每个节点的数据结构如下
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
广度优先搜索
- 从根节点开始遍历,将根节点加入队列,队列为
[50]
- 将队首
节点50
的所有子节点按照从左到右的顺序加入队列,队列为[50,3,67]
- 将节点
50
移出队列,队列为[3,67]
- 重复步骤2、3直到所有节点遍历完毕,即可完成广度优先搜索
遍历结果:50, 3, 67, 1, 34, 55, 13, 23
java代码实现如下
/**
* 广度优先搜索
* @param root
* @return
*/
public int[] bfs(TreeNode root) {
if (root == null) {
return new int[0];
}
List<Integer> result = new LinkedList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root); /* 将根节点放入队列 */
while (!queue.isEmpty()) {
TreeNode node = queue.poll(); /* 取出队首节点node */
result.add(node.val);
if (node.left != null) {
queue.add(node.left); /* 将node的左节点加入队列 */
}
if (node.right != null) {
queue.add(node.right); /* 将node的右节点加入队列 */
}
}
return result.stream().mapToInt(