JavaScript实现树深度优先和广度优先遍历搜索
2024-10-09 03:23:40
1、前置条件
我们提前构建一棵树,类型为 Tree
,其节点类型为 Note
。这里我们不进行过多的实现,简单描述下 Note
的结构:
class Node{
constructor(data){
this.data = data;
this.children = []; // 存放所以子节点,如果是二叉树,可以分为两个属性,left和right分别存储左右子节点
}
}
class Tree{
constructor(){
this.root = new Node('root'); // 树结构,标识出自己的根节点
}
}
2、广度优先遍历
广度优先遍历,就是按层来遍历树结构,例如:
1
2 3
4 5 6
// 遍历出来的结果:123456
实现思路:
- 首先创建一个队列,然后将树的根节点,放入队列,作为队列第一个元素
- 然后开始遍历队列,如果遍历的元素,有子节点,则将所有子节点,追加进队列末尾
- 最后的队列就是广度优先遍历的结果
使用JavaScript来实现:
- 最后的队列就是广度优先遍历的结果
function bsf(tree){
let quen = []; // 用来遍历的数组
// let result = []; // 遍历的结果
quen.push(tree.root);
// 从队列取,然后再追加
for(let i = 0;i<=quen.length-1;i++){
let k = quen[i];
if(k.children.length){
quen = quen.concat(k.children);
}
}
return quen;
}
3、深度优先搜索
先遍历完一个末尾节点,再遍历第二个末尾节点,例如:
1
2 3
4 5 6
// 遍历出来的结果:124536
深度优先,最简单的方法就是递归遍历,但是不适合实际中使用:
使用栈来实现深度优先遍历:
- 节点需要增加一些属性,来标识我们的计算状态,isDone是否已经检测过,isOver是否还有子节点未检测
- 建立一个栈,把树的根节点放进去。在准备一个数组,用来显示我们检测的路径
- 取出栈中最上面的节点,检测(检测完放进路径数组),然后将某个未检测的子节点,放入栈
- 重复3步骤,如果该节点,没有未检测的子节点,且自身已检测完毕,则将其上级节点,再次添加到 栈 中
- 重复3步骤
最新文章
- mySql 远程连接(is not allowed to connect to this MySQL server)
- tail -f 和 -F 的用法
- TCP/IP之四书五经[转自2003.12程序员]
- Node.js前端自动化工具:gulp
- MemcacheQ安装及使用
- ajax实际的应用
- HTML5每日一练之input新增加的URL类型与email类型应用
- web标准(复习)--4 纵向导航菜单及二级弹出菜单
- java_XML_比较【转】
- java动态代理实现与原理详细分析
- 剑指Offer(9)
- The connection string &#39;MysqlEF&#39; in the application&#39;s configuration file does not contain the require异常
- tr 设置margin、padding无效
- 转:Too many systemd: Created slice !
- selenium+python自动化93-Chrome报错:Python is likely shutting down
- VS Code折腾记 - (3) 多图解VSCode基础功能
- Nginx 虚拟主机 VirtualHost 配置
- struts 防止重复提交表单
- python__系统 : 进程
- 算法复习——floyd求最小环(poj1734)
热门文章
- 2019年2月5日训练日记关于int字节数,long int 字节数的讨论
- Codeforce 1155D Beautiful Array(DP)
- linux下编译boost的多线程程序
- aws mysql 开启慢查询日志, 并利用mysqlsla 分析
- golang server示例
- IoTClientTool自动升级更新
- thinkphp下的Webshell&;&;php过D盾一句话
- Linux(Ubuntu) MySQL数据库安装与卸载
- matlab数值数据和变量名
- Android 电池管理系统架构总结 Android power and battery management architecture summaries