es6遍历树结构并判断_NodeJS 树结构遍历 —— 深度优先和广度优先

本文介绍了如何使用 NodeJS 中的深度优先和广度优先遍历方法实现递归删除文件目录。首先解释了树的基本概念,接着详细阐述了同步和异步(回调、Promise、async/await)方式下先序深度优先遍历的实现,然后探讨了同步的广度优先遍历的实现。每种方法都通过具体的代码示例进行了说明,展示了在实际操作中如何应用这两种遍历策略。深度优先更适合递归删除文件目录场景。
摘要由CSDN通过智能技术生成

树的基本概念

树(Tree)是 n 个结点的有限集,n 为 0 时,称为空树,在任意一棵非空树中有且仅有一个特定的被称为根(Root)的结点,当 n 大于 1 时,其余结点可分为 m 个互不相交的有限集 T1、T2、......、Tm,其中每一个集合本身又是一棵树,并且称为 SubTree,即根的子树。

需要强调的是,n>0 时根结点是唯一的,不可能存在多个根结点,m>0 时,子树的个数没有限制,但它们一定是互不相交的。

从根开始定义起,根为第一层,根的孩子为第二层,若某结点在第 l 层,则其子树就在第 l+1 层,其双亲在同一层的结点互为 “堂兄弟”,树中结点的最大层级数称为树的深度(Depth)或高度。

在对树结构进行遍历时,按顺序可分为先序、中序和后续,按遍历的方式可分为深度优先和广度优先,我们这篇文章就通过使用先序深度优先和先序广度优先来实现 NodeJS 中递归删除目录结构,体会对树结构的遍历,文章中会大量用到 NodeJS 核心模块 fs 的方法,可以通过 NodeJS 文件操作 —— fs 基本使用 来了解文中用到的 fs 模块的方法及用法。

先序深度优先实现递归删除文件目录

深度优先的意思就是在遍历当前文件目录的时候,如果子文件夹内还有内容,就继续遍历子文件夹,直到遍历到最深层不再有文件夹,则删除其中的文件,再删除这个文件夹,然后继续遍历它的 “兄弟”,直到内层文件目录都被删除,再删除上一级,最后根文件夹为空,删除根文件夹。

1、同步的实现

我们要实现的函数参数为要删除的根文件夹的路径,执行函数后会删除这个根文件夹。

// 深度优先 —— 同步

// 引入依赖模块

const fs = require("fs");

const path = require("path");

// 先序深度优先同步删除文件夹

function rmDirDepSync(p) {

// 获取根文件夹的 Stats 对象

let statObj = fs.statSync(p);

// 检查该文件夹的是否是文件夹

if (statObj.isDirectory()) {

// 查看文件夹内部

let dirs = fs.readdirSync(p);

// 将内部的文件和文件夹拼接成正确的路径

dirs = dirs.map(dir => path.jion(p, dir));

// 循环递归处理 dirs 内的每一个文件或文件夹

for (let i = 0; i < dirs.length; i++) {

rmDirDepSync(dirs[i]);

}

// 等待都处理完后删除该文件夹

fs.rmdirSync(p);

} else {

// 若是文件则直接删除

fs.unlinkSync(p);

}

}

// 调用

rmDirDepSync("a");

上面代码在调用 rmDirDepSync 时传入 a,先判断 a 是否是文件夹,不是则直接删除文件,是则查看文件目录,使用 map 将根文件路径拼接到每一个成员的名称前,并返回合法的路径集合,循环这个集合并对每一项进行递归,重复执行操作,最终实现删除根文件夹内所有的文件和文件夹,并删除根文件夹。

2、异步回调的实现

同步的实现会阻塞代码的执行,每次执行一个文件操作,必须在执行完毕之后才能执行下一行代码,相对于同步,异步的方式性能会更好一些,我们下面使用异步回调的方式来实现递归删除文件目录的函数。

函数有两个参数,第一个参数同样为根文件夹的路径,第二个参数为一个回调函数,在文件目录被全部删除后执行。

// 深度优先 —— 异步回调

// 引入依赖模块

const fs = require("fs");

const path = require("path");

// 先序深度优先异步(回调函数)删除文件夹

function rmDirDepCb(p, callback) {

// 获取传入路径的 Stats 对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值