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

实现思路

    1. 首先创建一个队列,然后将树的根节点,放入队列,作为队列第一个元素
    1. 然后开始遍历队列,如果遍历的元素,有子节点,则将所有子节点,追加进队列末尾
    1. 最后的队列就是广度优先遍历的结果

      使用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

深度优先,最简单的方法就是递归遍历,但是不适合实际中使用:

使用栈来实现深度优先遍历

    1. 节点需要增加一些属性,来标识我们的计算状态,isDone是否已经检测过,isOver是否还有子节点未检测
    1. 建立一个栈,把树的根节点放进去。在准备一个数组,用来显示我们检测的路径
    1. 取出栈中最上面的节点,检测(检测完放进路径数组),然后将某个未检测的子节点,放入栈
    1. 重复3步骤,如果该节点,没有未检测的子节点,且自身已检测完毕,则将其上级节点,再次添加到 栈 中
    1. 重复3步骤

JavaScript实现树深度优先和广度优先遍历搜索的更多相关文章

  1. 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

    如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...

  2. 图的理解:深度优先和广度优先遍历及其 Java 实现

    遍历 图的遍历,所谓遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我们知道 ...

  3. 图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)

    学习了图的深度优先和广度优先遍历,发现不管是教材还是网上,大都为C语言函数式实现,为了加深理解,我以C++面向对象的方式把图的深度优先和广度优先遍历重写了一遍. 废话不多说,直接上代码: #inclu ...

  4. js实现对树深度优先遍历与广度优先遍历

    深度优先与广度优先的定义 首先我们先要知道什么是深度优先什么是广度优先. 深度优先遍历是指从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点的第一个未被访问的邻结点,然后再以此邻结点为顶点,继续 ...

  5. 树的广度优先遍历和深度优先遍历(递归非递归、Java实现)

    在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程.现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的) 1.广度优先遍历 英文缩写为BFS即B ...

  6. 树的深度优先遍历和广度优先遍历的原理和java实现代码

    import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode le ...

  7. 数据结构5_java---二叉树,树的建立,树的先序、中序、后序遍历(递归和非递归算法),层次遍历(广度优先遍历),深度优先遍历,树的深度(递归算法)

    1.二叉树的建立 首先,定义数组存储树的data,然后使用list集合将所有的二叉树结点都包含进去,最后给每个父亲结点赋予左右孩子. 需要注意的是:最后一个父亲结点需要单独处理 public stat ...

  8. python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法

    数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...

  9. python 实现图的深度优先和广度优先搜索

    在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...

随机推荐

  1. 在Jetson TX2上捕获、显示摄像头视频

    参考文章:How to Capture and Display Camera Video with Python on Jetson TX2 与参考文章大部分都是相似的,如果不习惯看英文,可以看看我下 ...

  2. 对MobileNet网络结构的解读

    引言 近几年来,CNN在ImageNet竞赛的表现越来越好.为了追求分类准确度,模型越来越深,复杂度越来越高,如深度残差网络(ResNet)其层数已经多达152层.但是在真实场景中如移动或者嵌入式设备 ...

  3. 【K8S】K8S 1.18.2安装dashboard(基于kubernetes-dashboard 2.0.0版本)

    [K8S]K8S 1.18.2安装dashboard(基于kubernetes-dashboard 2.0.0版本) 写在前面 K8S集群部署成功了,如何对集群进行可视化管理呢?别着急,接下来,我们一 ...

  4. MySQL 基础入门

    MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用 ...

  5. commons-logging slf4j log4j 区别

    日志门面 1.Apache通用日志接口(commons-logging.jar) Apache Commons包中的一个,包含了日志功能,必须使用的jar包.这个包本身包含了一个Simple Logg ...

  6. ubuntu16 安装curl

    sudo apt-get install openssl sudo apt-get install libssl-dev wget -P /usr/local/software  https://cu ...

  7. turtle库应用实例-五角星绘制

    五角星绘制 ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬ ...

  8. [Linux] Hexo 搭建个人博客

    不做笔记出了bug就得重新再看一遍视频 视频来源: https://www.bilibili.com/video/BV1Yb411a7ty?t=75 安装 先安装 nodejs,npm, git 安装 ...

  9. 线段树 I - Transformation 加乘优先级

    I - Transformation Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, …, a ...

  10. spring表达式语言

    使用文本表达式 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http: ...