JavaScript 数据结构——树

2023-10-27

概念

树是一种分层数据的抽象模型。

树的常用操作:

  • 深度优先遍历
  • 广度优先遍历

实现

JavaScript中没有树,但是可用ObjectArray来构建树,如上图中的树可表示为:

const tree = {
    val: 'A',
    children: [{
        val: 'B',
        children: [{
            val: 'D',
            children: [{
                val: 'J',
                children: []
            }]
        }, {
            val: 'E',
            children: []
        }, {
            val: 'F',
            children: []
        }]
    }, {
        val: 'C',
        children: [{
            val: 'G',
            children: []
        }, {
            val: 'H',
            children: []
        }]
    }]
};

遍历

深度优先遍历

尽可能地搜索树的分支。

  1. 访问节点
  2. 对根节点的子节点依次进行深度优先遍历

如上图所示,深度优先遍历这棵树,访问顺序为A - B - D - K - E - F - C - G - H

// 深度优先遍历
const dfs = (root) => {
    // 访问根节点
    console.log(root.val);
    // 对根节点的子节点依次进行深度优先遍历
    root.children.forEach(item => { dfs(item) });
};

广度优先遍历

先访问离根节点最近的节点。

  1. 新建队列根节点入队
  2. 队头出队并访问
  3. 把队头的子节点依次入队
  4. 循环2、3步骤,直到队列空

如上图所示,广度优先遍历这棵树,访问顺序为A - B - C - D - E - F - G - H - K,即按照一级、二级、三级节点的顺序依次访问。

// 广度优先遍历
const bfs = (root) => {
    // 创建队列
    const queue = [root];
    while (queue.length > 0) {
        // 获取根节点,根节点出队
        const n = queue.shift();
        // 访问队头
        console.log(n.val);
        // 队头的子节点依次入队
        n.children.forEach(item => {
            queue.push(item)
        });
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 数据结构——树 的相关文章

  • 无法在地图循环中访问 Axios 调用的值

    我有一个 javascript 对象 其 ID 对应于一组画廊 我使用地图循环遍历它 在每个循环中 我都会进行 axios 调用来获取当前 id 的图库 最后 我需要一个包含所有画廊内容的数组 问题是地图循环完成后我无法访问数据 当我 co
  • Flex、AngularJS + Masonry、akoenig/angular-deckgrid 等 [重复]

    这个问题在这里已经有答案了 我一直在发送此电子邮件 我即将发布一个用于 Web 应用程序安全的应用程序 它需要使用像 Masonry 这样的网格 我已经尝试过所有的 每一个角度模块 指令和不同的方法 包括基于 CSS 的技术 纯 Vanil
  • jQuery JSONP ajax,未设置身份验证标头

    我正在尝试使用以下设置向 google 联系人 API 发出 ajax 请求 ajax url https www opensocial googleusercontent com api people me all dataType js
  • Typescript:匿名函数内可能未定义的变量

    太长了 在匿名函数中使用变量之前检查变量仍然 TS 警告变量可能未定义 在下面的代码示例中变量baseDirId检查是否未定义 然后传递给 array map 函数 但 TS 发出警告baseDirId可以是未定义的 Typescript
  • 在 ajax 请求上启用 jQuery contextMenu 项

    我正在尝试更新上下文菜单 http medialize github com jQuery contextMenu docs htmlitem 如果 ajax 请求改变了我的 div 内容 这就是我的意思 我有一个这样的 div div c
  • 图表.js.如何更改“标签”数组的字体样式?

    我从 Chart JS 库中获取了一个图表 截屏 https i stack imgur com DnuRq png var ctx document getElementById myChart var data labels HTML
  • 为什么 Promise `.then` 方法的回调是反模式

    我在 StackOverflow 上看到了答案 人们建议为 AngularJS 服务提供回调函数 app controller tokenCtrl function scope tokenService tokenService getTo
  • 鼠标移动时画布拖动

    我正在尝试构建一个可以使用鼠标移动拖动的画布 我做了一些我无法理解的错误 因为一开始似乎有效 然后出现了一个增量错误 使画布移动得太快 考虑以下代码 window onload function var canvas document ge
  • 是否有任何理由使用 axios 而不是 ES6 fetch [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 研究了 axios 和 ES6 fetch 的文档 我发现两者非常相似 并且都受到 ajax 及其简写的强烈影响 axios 的主要优点是浏览器
  • 仅从功能区打开一个对话框

    我有一个带有登录按钮的功能区 可打开登录对话框 我想将对话框的数量限制为一个 我正在使用函数 displayDialogAsync startAddress options callback https learn microsoft co
  • 替换img路径jquery

    我正在尝试替换 jquery 中的 img 路径 注入远程页面 replaceexample com thumbs withexample com images 我已经尝试过这个 但似乎不起作用 img attr src replace t
  • 如何将焦点设置在 BootStrap 中的第一个输入字段上? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将焦点设置到独立于 id 的 HTML 表单中的第一个输入元素 https stackoverflow com questions 277544 how to set the focus to t
  • 基于范围内变量的角度设置形式动作

    我一直在尝试设置一个搜索表单 可以在其中注入表单操作属性 在我的表格中我有
  • 使用 eval 时不会受到 XSS 威胁

    我正在制作 不是现在 但我仍然对这个感到好奇 一款使用 HTML5 和 JS 的游戏 我想要的是人们可以插入自定义脚本 但要安全 function executeCustomJS code eval code bad 当然这段代码非常糟糕
  • 当 Chrome 中嵌套滚动中的数据更改时防止页面滚动

    我在页面中有一个固定大小的元素 带有 溢出 滚动 其内容经常更改 我预计该元素内部发生的更改会影响该元素的滚动 但不会影响页面滚动 但是当这个元素位于页面顶部时 页面本身开始滚动 我怎样才能防止这种情况发生 要重现此行为 我在 chrome
  • 将默认搜索文本添加到搜索框 html

    我正在努力将 搜索 文本添加到搜索框 我正在努力实现 onfocus 消失文本 And onblur 重新出现文本 到目前为止 我已经实现了这一点 但我必须将其硬编码为 html eg
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 为什么 TypeScript 混合了模块和原型模式?

    我正在查看此页面上 TypeScript 生成的 JS 代码 http www typescriptlang org Playground http www typescriptlang org Playground 基本上 要创建一个Gr
  • jQuery UI 对话框 - 关闭后无法打开

    我有一个问题jquery ui dialog box https jqueryui com dialog 问题是 当我关闭对话框然后单击触发它的链接时 除非刷新页面 否则它不会再次弹出 如何在不刷新实际页面的情况下回调对话框 下面是我的代码
  • eventSources 到事件 Json,完整日历

    我正在尝试从 eventSources 获取 json 调用到我的事件 我在 eventSources 中返回的 json 是 title Title Test start 1305841052 当我将此字符串传递到事件中时 它会正确显示日

随机推荐

  • TCP连接全过程

    三次握手 状态的含义 CLOSED 没有任何连接状态 LISTEN 侦听来自远方的TCP端口的连接请求 SYN SENT 再发送连接请求后等待匹配的连接请求 客户端 SYN RCVD 再收到和发送一个连接请求后等待对方对连接请求的确认 服务
  • 若依前后端分离版-服务端过滤器对POST请求参数解密(针对指定接口)+添加请求头

    一 过滤器中对指定接口进行加密 去除指定接口验证的话 将会是对所有接口请求参数进行解密 1 找到项目中的过滤器 RepeatableFilter 过滤器中的RepeatedlyRequestWrapper对POST请求参数数据允许可重复读取
  • spring-retry实现方法请求重试

    目录 1 spring retry是什么 2 使用步骤 2 1 引入maven库 2 2 在spring启动类上开启重试功能 2 2 公共业务代码 2 3 传统的重试做法 2 4 使用spring retry的命令式编码 2 4 1 定义重
  • 人工智能如何发展传统软件开发

    对于任何熟悉我的人来说 你很可能会意识到我对成年人的乐高有一种不健康的痴迷 无论您是遵循预设说明还是花时间计划和创建真正独特的东西 使用小构建块创建更大的东西都会让人非常满意 虽然我个人不喜欢 Play Doh 但我确实认识到它可以用来创造
  • Redis 深度历险:核心原理与应用实践

    小册介绍 Redis 是互联网技术架构在存储系统中使用最为广泛的中间件 它也是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一 特别是那些优秀的 竞争激烈的大型互联网公司 比如 Twitter 新浪微博 阿里云 腾讯云 淘宝 知乎等
  • xmind各版本区别_思维导图工具 XMind 出了一个高颜值版:XMind ZEN

    XMind 对于思维导图的使用者来说不会陌生 作为一款优质的国产思维导图软件 它不仅有强大的功能 而且还可以同时在 macOS Windows 和 Linux 上使用 不过 跨平台的特性也为软件带来了一些问题 由于使用 Java 实现跨平台
  • 电影9 10大经典电影

    10大经典电影 人生篇 1 肖申克的救赎 2 百万金婴 3 悲惨世界 1958年版 4 辛德勒的名单 5 阿甘正传 6 勇敢的心 7 活着 8 天堂影院 9 杀手里昂 10 完美的世界 10大经典电影 警匪篇 1 盗火线 2 喋血双雄 3
  • C#调用Java类的方法

    一 将已经编译后的java中Class文件进行打包 打包命令JAR 如 将某目录下的所有class文件夹全部进行打包处理 使用的命令 jar cvf test jar C com 其中test jar为要生成的jar包 com 为指定的当前
  • python-selenium(webdriver)中的自动截屏并获取验证码的位置

    因为最近在搞一个购票的一个爬虫需要获取当前验证码的位置信息进行打码 因为是用的selenium测试工具所以在网上找了多个资料搞出来的 记录下一成果 encoding utf 8 from PIL import Image from sele
  • Python爬虫实战(二):爬取天涯帖子(只看楼主)

    先上代码 coding utf 8 import requests from bs4 import Tag from bs4 import BeautifulSoup def getHtml url page requests get ur
  • postmapping注解参数说明_通过验证框架实现统一参数校验

    在我们实际项目开发过程中 避免不了的就是参数的校验 一般参数的校验 分为如下几种情况 1 前端直接验证 2 在Controller层单独验证 3 通过集成验证框架验证 显然3种里面 我们一般建议1 3结合的方式进行参数的校验比较合理和安全
  • Java 编程技术中汉字问题的分析及解决,文件操作

    在基于 Java 语言的编程中 我们经常碰到汉字的处理及显示的问题 一大堆看不懂的 乱码肯定不是我们愿意看到的显示效果 怎样才能够让那些汉字正确显示呢 在基于 Java 语言的编程中 我们经常碰到汉字的处理及显示的问题 一大堆看不懂的 乱码
  • 特征描述子与匹配

    图像特征描述子 即图像中每个像素位置的描述 通过此描述去匹配另一张图像是否含有相同特征 一般用来 大图找小图 具有旋转不变性和尺度不变性 代码示例 include
  • How to set the I/O Queue depth on VMware ESX servers?

    有些客户会碰到如何设置主机HBA队列深度的问题 其实这个队列深度是要根据不同情况来设置的 而并非是一个固定数值 可以看到下面的文章 有一个方法可以告诉我们如何去设置这个数值 很显然 不同厂商的存储 FA口的缓存大小也是不同的 所以不可以用这
  • Java高级工程师系列学习路线介绍,成功拿到offer

    正文 下文中截图来源于朋友一个pdf版本的面经 把所以知识点的答案整理了下来 耗费他至少1个月时间 在本文最后部分把这个pdf分享给大家 觉得有用的麻烦点赞关注走一波 谢谢 面经中有他的知识点的答案 如下图示例 非常详细 文末有领取方式 1
  • thinkPHP6.0入门笔记(一)——环境配置

    thinkPHP6 0环境配置 选择thinkPHP的原因 thinkPHP6 0引入bootstrap 选择thinkPHP的原因 虽然php的热度已经大不如从前了 在实用上存在较多的高并发问题 但是相对于java和go php的语法更加
  • mac node 操作

    安装nvm命令 Mac 安装 nvm 知乎 2 安装node Mac安装node 简书
  • Elasticsearch学习(十六)Elasticsearch8 http方式使用用户名密码访问集群

    目录 前言 步骤 1 环境 2 解压 3 生成证书 elastic stack ca p12 4 生成证书 elastic certificates p12 5 将证书拷贝到其他节点 6 配置密码 7 配置 elasticsearch ym
  • No valid entries or contents found, this is not a valid OOXML (Office Open XML) file

    问题描述 导出Excel的时候出现的异常 我这个导出是为导入Excel做准备的 也就是用户先下载模板 然后根据模板填写数据再导入Excel 模板当中Excel也是可以正常打开的 解决过程 Maven编译过后的target文件夹当中的Exce
  • JavaScript 数据结构——树

    概念 树是一种分层数据的抽象模型 树的常用操作 深度优先遍历 广度优先遍历 实现 JavaScript中没有树 但是可用Object和Array来构建树 如上图中的树可表示为 const tree val A children val B