JS算法 —— 二叉树的dfs(深度)和bfs(广度)遍历

10 篇文章 0 订阅
订阅专栏

一、二叉树

演示图在这里插入图片描述

tree:

const tree = {
    val: 1,
    left: {
        val: 2,
        left: null,
        right: {
            val: 4,
            left: null,
            right: {
                val: 7,
                left: null,
                right: {
                    val: 8,
                    left: null,
                    right: null
                }
            }
        }
    },
    right: {
        val: 3,
        left: {
            val: 5,
            left: null,
            right: null
        },
        right: {
            val: 6,
            left: null,
            right: null
        }
    }
}

二、dfs深度优先遍历

从左到右,每次都遍历到叶子节点。
使用递归的方法,先递归左部分,然后递归右边部分。

function dfs(node) {
    if (!node) {
        return;
    }
    console.log(node.val); //处理操作
    dfs(node.left);
    dfs(node.right);
}

dfs(tree);

在这里插入图片描述

三、bfs广度优先遍历(层次遍历)

从上到下,每次都要把每层遍历完。
引入队列,来保存每层的节点,用于遍历。

//运用队列
var bfs = function (root) {
    //二叉树的层次遍历
    let res = [];
    let quene = [root];
    if (root === null) {
        return res;
    }
    while (quene.length !== 0) {
        let currentLevel = [];
        let len = quene.length;
        for (let i = 0; i < len; i++) {
            let node = quene.shift();
            currentLevel.push(node.val);
            console.log(node.val);
            if (node.left) quene.push(node.left);
            if (node.right) quene.push(node.right);
        }
        res.push(currentLevel);
    }
    return res;
};

let res = bfs(tree);
console.log(res);

在这里插入图片描述

运用了队列先进先出的原则,首先将队列初始化为只包含根节点:

let quene = [root]

因为后面还会给队列添加节点,所以使用while循环来保证一直循环到所有节点遍历完。
使用一个for循环遍历当前层的所有节点:

for (let i = 0; i < len; i++) {
    let node = quene.shift();//取出队列第一个元素
    currentLevel.push(node.val);
    console.log(node.val);
    if (node.left) quene.push(node.left);
    if (node.right) quene.push(node.right);
}

在访问当前层节点的同时,将当前层每个节点的子节点入队列,用于下一次while循环访问。
例如第一次while循环后,也就是" 1 "被访问后,队列应该是:

[{
        val: 2,
        left: null,
        right: {
            val: 4,
            left: null,
            right: {
                val: 7,
                left: null,
                right: {
                    val: 8,
                    left: null,
                    right: null
                }
            }
        }
    },
    {
        val: 3,
        left: {
            val: 5,
            left: null,
            right: null
        },
        right: {
            val: 6,
            left: null,
            right: null
        }
    }

]

下一次出队列的便是" 2 "节点。

数据结构、算法与应用:C++语言描述(原书第2版)第二部分
12-06
Data Structures, Algorithms, and Applications in C++, Second Edition 出版者的话 译者序 前言 第一部分 预备知识 第1章 C++回顾 1.1 引言 1.2 函数与参数 1.2.1 传值参数 1.2.2 模板函数 1.2.3 引用参数 1.2.4 常量引用参数 1.2.5 返回值 1.2.6 重载函数 1.3 异常 1.3.1 抛出异常 1.3.2 处理异常 1.4 动态存储空间分配 1.4.1 操作符new 1.4.2 一维数组 1.4.3 异常处理 1.4.4 操作符delete 1.4.5 二维数组 1.5 自有数据类型 1.5.1 类currency 1.5.2 一种不同的描述方法 1.5.3 操作符重载 1.5.4 友元和保护性类成员 1.5.5 增加#ifndef、#define和#endif语句 1.6 异常类illegalParameterValue 1.7 递归函数 1.7.1 递归的数学函数 1.7.2 归纳 1.7.3 C++递归函数 1.8 标准模板库 1.9 测试与调试 1.9.1 什么是测试 1.9.2 测试数据的设计 1.9.3 调试 1.10 参考及推荐读物 第2章 程序性能分析 2.1 什么是程序性能 2.2 空间复杂度 2.2.1 空间复杂度的组成 2.2.2 举例 2.3 时间复杂度 2.3.1 时间复杂度的组成 2.3.2 操作计数 2.3.3 最好、最坏和平均操作计数 2.3.4 步数 第3章 渐近记法 3.1 引言 3.2 渐近记法 3.2.1 大Ο记法 3.2.2 渐近记法Ω和Θ 3.3 渐近数学(可选) 3.3.1 大O记法 3.3.2 Ω记法 3.3.3 Θ记法 3.3.4 小ο记法 3.3.5 特性 3.4 复杂度分析举例 3.5 实际复杂度 3.6 参考及推荐读物 第4章 性能测量 4.1 引言 4.2 选择实例的大小 4.3 设计测试数据 4.4 实验设计 4.5 高速缓存 4.5.1 简单计算机模型 4.5.2 缓存未命中对运行时间的影响 4.5.3 矩阵乘法 4.6 参考及推荐读物 第二部分 数据结构 第5章 线性表——数组描述 5.1 数据对象和数据结构 5.2 线性表数据结构 5.2.1 抽象数据类型linearList 5.2.2 抽象类linearList 5.3 数组描述 5.3.1 描述 5.3.2 变长一维数组 5.3.3 类arrayList 5.3.4 C++迭代器 5.3.5 arrayList的一个迭代器 5.4 vector的描述 5.5 在一个数组中实现的多重表 5.6 性能测量 5.7 参考及推荐读物 第6章 线性表——链式描述 6.1 单向链表 6.1.1 描述 6.1.2 结构chainNode 6.1.3 类chain 6.1.4 抽象数据类型linearList的扩充 6.1.5 类extendedChain 6.1.6 性能测量 6.2 循环链表和头节点 6.3 双向链表 6.4 链表用到的词汇表 6.5 应用 6.5.1 箱子排序 6.5.2 基数排序 6.5.3 凸包 6.5.4 并查集 第7章 数组和矩阵 7.1 数组 7.1.1 抽象数据类型 7.1.2 C++数组的索引 7.1.3 行主映射和列主映射 7.1.4 用数组的数组来描述 7.1.5 行主描述和列主描述 7.1.6 不规则二维数组 7.2 矩阵 7.2.1 定义和操作 7.2.2 类matrix 7.3 特殊矩阵 7.3.1 定义和应用 7.3.2 对角矩阵 7.3.3 三对角矩阵 7.3.4 三角矩阵 7.3.5 对称矩阵 7.4 稀疏矩阵 7.4.1 基本概念 7.4.2 用单个线性表描述 7.4.3 用多个线性表描述 7.4.4 性能测量 第8章 栈 8.1 定义和应用 8.2 抽象数据类型 8.3 数组描述 8.3.1 作为一个派生类实现 8.3.2 类arrayStack 8.3.3 性能测量 8.4 链表描述 8.4.1 类derivedLinkedStack 8.4.2 类linkedStack 8.4.3 性能测量 8.5 应用 8.5.1 括号匹配 8.5.2 汉诺塔 8.5.3 列车车厢重排 8.5.4 开关盒布线 8.5.5 离线等价类问题 8.5.6 迷宫老鼠 8.6 参考及推荐读物 第9章 队列 9.1 定义和应用 9.2 抽象数据类型 9.3 数组描述 9.3.1 描述 9.3.2 类arrayQueue 9.4 链表描述 9.5 应用 9.5.1 列车车厢重排 9.5.2 电路布线 9.5.3 图元识别 9.5.4 工厂仿真 9.6 参考及推荐读物 第10章
区间覆盖最大leetcode-Data-Structures-and-Algorithms:具有全面测试、覆盖和持续集成的数据结构和算法
06-30
区间覆盖最大leetcode 数据结构和算法 具有全面测试、覆盖和跨平台持续集成的数据结构和算法。 这个存储库的目标是从一个问题平稳地过渡到另一个问题,记录有趣的方面,并涵盖大量实际问题。 数据结构 堆 队列 链表 树 堆 图形 算法设计范式 分而治之 贪婪的 动态规划 完全的 树 串行 问题 标签 在线的 1 顺序遍历 二叉树DFS遍历 2 前序遍历 二叉树DFS遍历 3 后序遍历 二叉树DFS遍历 4 层序遍历 二叉树BFS遍历 5 检查二叉树是否是二叉搜索树 顺序遍历 6 二叉搜索树中的第 K 个最小元素 顺序遍历 7 最低共同祖先 二叉树DFS 图形 串行 问题 标签 在线的 1 深度优先搜索 遍历 2 广度优先搜索 遍历 堆 串行 问题 标签 在线的 1 将十进制数转换为其等效的二进制数 2 评估后缀表达式 3 检查表达式是否包含平衡括号 4 将中缀表达式转换为其后缀等价物 分而治之 串行 问题 标签 在线的 1 唐叶乘法 不使用 * 的乘法 2 归并排序 快速排序 3 快速排序 (最快)就地排序 4 快速选择 第 K 个最小(或最大)值 贪婪的 串行 问题
2.手写JavaScript广度深度优先遍历二叉树
g841805的博客
04-06 673
依靠栈先进后出的机制,分别设置返回结果的数组和栈数组,首先判断栈非空,对每个结点,将其出栈并把值push到结果数组,判断是否有孩子,分别将其加入栈中,循环执行上述操作。否则返回结果数组。
leetcode中DFSBFS算法在数组和字符串中的应用
12-20
DFS深度优先遍历)与BFS广度优先遍历算法是基于树和图结构进行遍历的两种算法。 一般来说DFS在前中后遍历中运用比较明显,DFS的运用基本是要利用递归进行嵌套使用。回溯算法其实也是一种比较经典的DFS算法升级运用 而BFS比较经典的运用就是层次遍历,一般会运用数组和while循环不断进行pop和insert操作。 涉及到回溯算法和递归的二叉树结构题,之前已经进行过总结: leetcode回溯算法 leetcode二叉树遍历与递归题目汇总 然而,对于字符串和数组类的结构,我自己在开始的时候很难将其与DFSBFS算法结合起来。所以为了更深入的理解DFSBFS算法的精髓,这里针对这些数据
python 遍历二叉树的方法代码示例
11-01
在Python中遍历二叉树可以使用不同的遍历算法,包括深度优先搜索(DFS)和广度优先搜索(BFS
数据结构总结(自学、期末复习或考研备用).pdf
01-16
内容涵盖:第一章绪论、算法衡量指标、第二章线性表、顺序表、链表、第三章栈和队、栈、栈的应用举例、队列、循环队列、第四章串、串的模式匹配、第五章数组和广义表、稀疏矩阵的压缩存储方法:、广义表、第六章树和二叉树二叉树二叉树遍历、线索二叉树、树和森林的表示方法、树、森林与二叉树互换、哈夫曼树与哈夫曼编码、哈夫曼树、哈夫曼编码:、第七章图、图的存储结构:、图的遍历深度优先遍历(DFS)、广度优先遍历(BFS算法)、最小生成树、普里姆算法、克鲁斯卡尔算法、最短路径、迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法、拓扑排序、关键路径、第八章查找、顺序查找 折半查找、插值查找、次优二叉树、二叉排序树(BST)、二叉平衡树(AVL树)、左旋和右旋 平衡二叉树的插入:、哈希表、Hash碰撞的解决方案?、链地址法、开放地址法、第九章排序、直接插入排序、折半插入排序、表插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、固定最大值再构造堆、归并排序、桶排序、基数排序 各种排序方法的综合比较
js实现深度优先搜索(DFS)和广度优先搜索(BFS)
weixin_46734347的博客
04-05 4482
深度优先搜索(DFS) 首先构造一个我们需要遍历的结构,这里用html演示 <div id="root"> <p></p> <label></label> <ul> <li> <span></span> </li> <li></li>
二叉树遍历 js实现
qq_52046856的博客
04-13 1347
二叉树主要有两种遍历方式:一是深度优先遍历,即先往二叉树底部走,遇到叶子节点再返回;二是广度优先遍历,即对二叉树的每一层逐层遍历节点。
JS实现二叉树的创建和遍历
11-06 274
1、先说二叉树遍历遍历方式:    前序遍历:先遍历根结点,然后左子树,再右子树    中序遍历:先遍历左子树,然后根结点,再右子树    后续遍历:先遍历左子树,然后右子树,再根结点 上代码:主要还是利用递归 function TreeCode() { let BiTree = function (ele) { this.data ...
JS实现图的BFSDFS
学习真香
09-26 1688
JS实现图的BFSDFS 通过在极客时间上学习的算法内容. 我用JS实现图的BFSDFS. 这里分享给大家. 本文使用图的存储方式是 邻接表 代码中使用的是无向图, 有向图类似. 例子都是从 s 到 t 最后一部分有全部的代码, 和一个小的测试用例 BFS BFS 也就是 Breadth First Search 广度优先搜索 可以理解为地毯式地搜索, 一层一层地搜索. 是不是想起树的层序遍历了? BFS 同样利用了一个 queue 作为辅助工具. 如果, 我们想要向上图一样遍历. 首先我们要解决下面
每日一知识:图的遍历算法(bfs+dfs),javascript实现
aniudunaichiji的博客
07-26 908
在计算机中,图结构也是一种非常常见的数据结构。图论也是一个非常大的话题图结构是一种与树结构有些相似的数据结构。本文介绍了图的封装以及图的遍历算法
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
10-18
二叉树遍历是访问树中所有节点的一种方法,通常分为深度优先遍历DFS,Depth-First Search)和广度优先遍历BFS,Breadth-First Search)。在PHP中,我们可以使用递归或非递归的方式来实现这些遍历算法。 1. 深度...
java实现二叉树的创建及5种遍历方法(总结)
08-30
`bfs`方法实现了广度优先遍历,`dfs`方法使用栈实现了深度优先遍历。 通过理解以上知识点,我们可以有效地创建和遍历二叉树,这在解决许多算法问题时非常有用。二叉树遍历方法不仅有助于理解树的结构,还可以应用...
邻接矩阵存储图的深度优先遍历 邻接矩阵表示图-深度-广度优先遍历
07-05
在计算机科学中,图是一种...DFS在某些情况下(如查找树的最小公共祖先,检测环)更为适用,而BFS常用于寻找最短路径问题(如二叉树的层次遍历,Dijkstra算法)。了解并灵活运用这两种遍历方法是解决图论问题的关键。
JS中的二叉树遍历详解
10-22
总的来说,二叉树遍历是理解数据结构和算法的关键部分,它在许多实际应用中都有所体现,如搜索、排序和文件系统操作等。无论是递归还是非递归方法,掌握这些遍历技巧都能帮助开发者更高效地处理树形数据结构的问题。
js前端算法---树 深度优先遍历 广度优先遍历 实现
qq_42619366的博客
05-11 985
js前端算法---树 深度优先遍历 广度优先遍历 实现
javascript中采用深度优先和广度优先遍历DOM树算法
weixin_51431277的博客
04-02 1283
javascript中采用深度优先和广度优先遍历DOM树算法
js的数独游戏(dfs),大佬推荐,开发前端基础
uiuuyy67的博客
03-17 857
/下面开始才是运行流程//先便利原二维数组,得到缓存row、col、box、cb,如果是’.‘就给个[’.']//start优化开始跳过最开始的一串原始数字//用来判断是否经历过空单元格i < N;filter(i, j, cur)) return(‘不是有效数独’)} else {//深度递归函数,以index序号0-80为递归依据//每个单元格根据fx函数拿到nums数组//根据序号拿到坐标值。
js的数独游戏(dfs),web开发需要学什么
最新发布
2401_84140060的博客
04-17 873
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。空(void)元素有那些?//先便利原二维数组,得到缓存row、col、box、cb,如果是’.‘就给个[’.']//nums返回的数组可能长度为0、1、或者多个,要么来源于初始,要么来源于cb。//如果是0说明已经没有选择了(题目中表示一定有唯一解,所以可以忽略)//如果这个数字不能用,不好意思只能弹出,不能影响接下来的判断。//如果不满足递归正确的条件,则说明现在为止的数字都是不对的。
深度优先与广度优先遍历
09-28
深度优先遍历DFS)和广度优先遍历BFS)是图论中两种常用的算法DFS从一个未遍历的节点出发,沿着一条路径一直遍历到最深的节点,然后回溯到前一个节点,继续遍历其他未访问的相邻节点,直到所有节点都被遍历BFS则从一个节点出发,先遍历其所有相邻节点,然后再依次遍历每个相邻节点的相邻节点,直到所有节点都被遍历。 以二叉树为例,实现深度优先遍历可以使用递归或栈的方式。递归方式可以通过先遍历左子树,再遍历右子树,最后访问根节点的顺序进行遍历。栈方式则是使用一个栈来保存待访问的节点,先将根节点入栈,然后循环以下步骤:出栈一个节点,访问该节点,然后将其右子节点和左子节点入栈,直到栈为空。 实现广度优先遍历可以使用队列的方式。使用一个队列来保存待访问的节点,先将根节点入队,然后循环以下步骤:出队一个节点,访问该节点,然后将其左子节点和右子节点入队,直到队列为空。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • node.js和npm的安装与环境配置(2021最新版) 87119
  • Vue实现图片预览(Viewer.js) 30043
  • 【JavaScript】关于[object Object] 26654
  • 数据库sql语句查询选修了全部课程的学生姓名。 15885
  • ElementPlus DateTimePicker日期时间选择器限制可选时间范围(精确时分秒) 15662

分类专栏

  • Vue 48篇
  • 前端 24篇
  • JavaScript算法 10篇
  • 我好像不会CSS 8篇
  • 我好像不会JavaScript 24篇
  • 微信小程序 12篇
  • JavaWeb 9篇
  • React 7篇
  • Java 9篇
  • 我好像不会HTML 6篇
  • 数据库 4篇
  • 数据结构课程设计 5篇
  • 排序 5篇

最新评论

  • ElementPlus非表单组件ElUpload值更新后校验不消失问题

    2401对符合规定: 优质好文,博主的文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,文章思路清晰【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • JavaScript算法实现dfs查找省市区路径

    2301_82241847: 学到了,细节很到位!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • JavaScript算法实现dfs查找省市区路径

    2401_85112761: 好文,细节很到位!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • JavaScript算法实现dfs查找省市区路径

    2401_84617080: 每当我阅读你的编程博客文章时,我总能感受到你的专业水平和耐心解答的精神。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • ElementPlus非表单组件ElUpload值更新后校验不消失问题

    2401_84418908: 写的很好,细节很到位!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • vue3组合式api的正确用法
  • npm语义化版本和版本运算符
  • JavaScript算法实现dfs查找省市区路径
2024年4篇
2023年6篇
2022年94篇
2021年59篇
2020年13篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小绵杨Yancy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值

深圳SEO优化公司光明百搜标王惠州网页制作西乡网络推广龙岗外贸网站设计荷坳网络广告推广光明企业网站制作大鹏网站排名优化广州网站排名优化东莞网站开发南澳网站制作龙岗网站关键词优化观澜关键词排名爱联网站优化软件木棉湾建设网站荷坳网站搭建福田网站设计模板南联网站seo优化宝安seo大运网站改版荷坳推广网站南澳网站优化推广沙井网站改版盐田网站优化坂田网站排名优化民治关键词按天收费坪地seo网站优化同乐模板网站建设双龙模板推广荷坳网站搜索优化东莞网站建设歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化