JavaScript实现树深度优先和广度优先遍历搜索
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步骤
JavaScript实现树深度优先和广度优先遍历搜索的更多相关文章
- 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现
如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...
- 图的理解:深度优先和广度优先遍历及其 Java 实现
遍历 图的遍历,所谓遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我们知道 ...
- 图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)
学习了图的深度优先和广度优先遍历,发现不管是教材还是网上,大都为C语言函数式实现,为了加深理解,我以C++面向对象的方式把图的深度优先和广度优先遍历重写了一遍. 废话不多说,直接上代码: #inclu ...
- js实现对树深度优先遍历与广度优先遍历
深度优先与广度优先的定义 首先我们先要知道什么是深度优先什么是广度优先. 深度优先遍历是指从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点的第一个未被访问的邻结点,然后再以此邻结点为顶点,继续 ...
- 树的广度优先遍历和深度优先遍历(递归非递归、Java实现)
在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程.现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的) 1.广度优先遍历 英文缩写为BFS即B ...
- 树的深度优先遍历和广度优先遍历的原理和java实现代码
import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode le ...
- 数据结构5_java---二叉树,树的建立,树的先序、中序、后序遍历(递归和非递归算法),层次遍历(广度优先遍历),深度优先遍历,树的深度(递归算法)
1.二叉树的建立 首先,定义数组存储树的data,然后使用list集合将所有的二叉树结点都包含进去,最后给每个父亲结点赋予左右孩子. 需要注意的是:最后一个父亲结点需要单独处理 public stat ...
- python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法
数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...
- python 实现图的深度优先和广度优先搜索
在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...
随机推荐
- C语言基础知识总结
知识点的回忆与巩固 一. 条件分支结构 1.if分支语句 2.switch语句 二.循环体部分知识点整理 1.for循环 2.while循环-适合不确定循环次数时使用 三.字符串与数组 数组的操作 1 ...
- 题解 P2261【[CQOI2007]余数求和】
P2261[[CQOI2007]余数求和] 蒟蒻终于不看题解写出了一个很水的蓝题,然而题解不能交了 虽然还看了一下自己之前的博客 题目要求: \[\sum_{i=1}^{n}{k \bmod i} \ ...
- python(For 循环语句)
一.For循环 Python for 循环可以遍历任何序列的项目,如一个列表或者一个字符串或者字典等. 语法模式:for var in sequence: (1)从某个集合(列表等)里顺次取值 #遍历 ...
- muduo网络库源码学习————线程特定数据
muduo库线程特定数据源码文件为ThreadLocal.h //线程本地存储 // Use of this source code is governed by a BSD-style licens ...
- Android APK 重签名
对APK 进行在线 加固后,Apk体积一般会变大,而且Apk会无法直接安装,因为缺少了你的签名.是的,你需要对这个Apk进行重签名. 如何重签名 重签名的方法,一般来说,有两种,第一种是用JDK自带的 ...
- Matlab矩阵总结
- Programmatically add an application to Windows Firewall
Programmatically add an application to Windows Firewall 回答1 Not sure if this is the best way, but ...
- Altera特殊管脚的使用
- JDBC08时间处理
时间类型 java.util.Date 子类: -java.sql.Date无时分秒 -java.sql.Time -java.sql.Timestamp
- [zoj3813]Alternating Sum 公式化简,线段树
题意:给一个长度不超过100000的原串S(只包含数字0-9),令T为将S重复若干次首尾连接后得到的新串,有两种操作:(1)修改原串S某个位置的值(2)给定L,R,询问T中L<=i<=j& ...