DFS(深度优先搜索)和BFS(广度优先搜索)
Depth-First Search
Breadth-First Search
深度优先搜索
思想
用玩迷宫为例子——把所有的路都走了遍总会有一条走得通的路!——深度优先搜索的核心思想,是试图穷举所有的完整路径。
本质——栈结构
栈:先进后出
深度优先搜索的过程可以转化为一系列的入栈、出栈操作——代码实现:使用递归来模拟入栈、出栈的逻辑。
DFS 与二叉树的遍历
递归调用的函数执行过程本身就是一个栈,叫做函数调用栈,入栈规则为函数调用,出栈规则为函数执行完毕
广度优先搜索
访问顺序符合“先进先出”原则,BFS 算法的实现过程,和队列有着密不可分的关系
思想
与深度优先搜索不同的是,广度优先搜索(BFS)并不执着于“一往无前”这件事情。它关心的是眼下自己能够直接到达的所有坐标,其动作有点类似于“扫描”,一层一层地扫描
BFS实战:二叉树的层序遍历
看到“层次”关键字,大家应该立刻想到“扫描”;想到“扫描”,就应该立刻想到 BFS
function BFS(root) {
const queue = [] // 初始化队列queue
// 根结点首先入队
queue.push(root)
// 队列不为空,说明没有遍历完全
while (queue.length) {
const top = queue[0] // 取出队头元素
// 访问 top
console.log(top.val)
// 如果左子树存在,左子树入队
if (top.left) {
queue.push(top.left)
}
// 如果右子树存在,右子树入队
if (top.right) {
queue.push(top.right)
}
queue.shift() // 访问完毕,队头元素出队
}
}
// 二叉树编码
const root = {
val: "A",
left: {
val: "B",
left: {
val: "D"
},
right: {
val: "E"
}
},
right: {
val: "C",
right: {
val: "F"
}
}
};
// 执行
BFS(root)
// 输出
A
B
C
D
E
F