JavaScript中的深度优先(dfs)和广度优先(bfs)

文章小tips:

  1. 先看案例在看思路会更懂点
  2. 算法还是多需要练习,每个大点讲完都有LeetCode练习

测试 bfs 和 dfs html文件公共代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>bfs</title>
</head>

<body>
    <div id="parent">
        <div class="children1">
            <div class="children1-1">
                <div class="children1-1-1">a</div>
            </div>
            <div class="children1-2">
                <div class="children1-2-1">b</div>
            </div>
        </div>
        <div class="children2">
            <div class="children2-1">
                <div class="children2-1-1">c</div>
            </div>
            <div class="children2-2">
                <div class="children2-2-1">d</div>
            </div>
        </div>
        <div class="children3">
            <div class="children3-1">e</div>
        </div>
    </div>
    <script>
        // js code here
    </script>
</body>

</html>

前置知识点

  • js模拟栈:数组的push方法进栈pop方法出栈
  • js模拟队列:数组的push方法进队列shift方法出队列

深度优先遍历(dfs)

数据结构:(先进后出)

遍历过程:
在这里插入图片描述

思路

  1. 先判断根节点是否为空,如果为空直接返回空,则初始化stack
  2. stack中的父节点出栈,存入nodes中,之后找子节点
  3. 如果有子节点,子节点数组出栈children
  4. 循环执行第二第三步,直至stack栈为空结束循环

代码如下:

let node_parent = document.querySelector("#parent")
// DFS 深度优先遍历 栈
let dfs = (node) => {
    let stack = [] // 栈
    let nodes = [] // 存所有节点
    if (node) {
        stack.push(node)
        while (stack.length) {
            let item = stack.pop() // 出栈
            nodes.push(item)
            let children = Array.from(item.children) // 获取所有节点
            while(children.length) {
                stack.push(children.pop())
            }
        }
    }
    return nodes
}
console.log(dfs(node_parent));

打印结果:
在这里插入图片描述
练习:LeetCode DFS练习

广度优先遍历(bfs)

数据结构:队列(先进先出)

遍历过程:
在这里插入图片描述

思路

  1. 先判断根节点是否为空,如果为空直接返回空,则初始化stack
  2. stack中的父节点出栈,存入nodes中,之后找子节点
  3. 如果有子节点,子节点数组出队列children
  4. 循环执行第2第3步,stack队列为空结束循环

js代码如下:

let node_parent = document.querySelector("#parent")
// BFS 深度优先遍历 队列
let bfs = (node) => {
    let stack = [] // 队列
    let nodes = [] // 存所有节点
    if (node) {
        stack.push(node)
        while(stack.length) {
            let item = stack.shift()
            nodes.push(item)
            let children = Array.from(item.children)
            while(children.length) { 
                stack.push(children.shift())
            }
        }
    }
    return nodes
}
console.log(bfs(node_parent));

测试结果:
在这里插入图片描述
练习:LeetCode BFS练习

LeetCode打卡群:260367472

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影风莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值