day9-1:DFS & BFS 初认识

106 阅读2分钟

DFS(深度优先搜索)和BFS(广度优先搜索)
Depth-First Search
Breadth-First Search

深度优先搜索

思想

用玩迷宫为例子——把所有的路都走了遍总会有一条走得通的路!——深度优先搜索的核心思想,是试图穷举所有的完整路径

image.png

本质——栈结构

栈:先进后出

深度优先搜索的过程可以转化为一系列的入栈、出栈操作——代码实现:使用递归来模拟入栈、出栈的逻辑。

DFS 与二叉树的遍历

递归调用的函数执行过程本身就是一个栈,叫做函数调用栈,入栈规则为函数调用,出栈规则为函数执行完毕

广度优先搜索

访问顺序符合“先进先出”原则,BFS 算法的实现过程,和队列有着密不可分的关系

思想

与深度优先搜索不同的是,广度优先搜索(BFS)并不执着于“一往无前”这件事情。它关心的是眼下自己能够直接到达的所有坐标,其动作有点类似于“扫描”一层一层地扫描

image.png

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