有趣且重要的JS知识合集(22)树相关的算法

0、举例:树形结构原始数据

 1、序列化树形结构 

/**
 * 平铺序列化树形结构
 * @param tree 树形结构
 * @param result 转化后一维数组
 * @returns Array<TreeNode>
 */
export function flattenTree(tree, result = []) {
  if (tree.length === 0) {
    return result
  }
  for (const node of tree) {
    result.push(node);
    if (node.children) {
      flattenTree(node.children, result);
    }
  }
  return result;
}

结果:

2、数组转化为树形结构

/**
 * 数组转化为树形结构(常用于后台菜单数组转换成树形结构)
 */
export function arrToTree(data) {
  let result = []
  let map = new Map()
  data.forEach(item => {
    // 存入字典集里
    map.set(item.id, item)
  })
  data.forEach(item => {
    item.children = [];
    // 判断字典集里是否有该键
    let parent = map.get(item.pId)
    if (parent) {
      parent.children.push(item)
    } else {
      result.push(item)
    }
  })
  return result
}

结果:

 

 3、BFS 寻找树形结构下指定节点id 上属直接或间接的祖先节点

    /**
     * 寻找树形结构下指定节点id 上属直接或间接的祖先节点
     * @param {*} tree 树形结构
     * @param {*} id 节点id
     */
    bfsFindAncestors(tree, id) {
      if (!tree?.length) return [];
      // 初始化队列,将根节点和空的祖先数组放入队列
      const queue = [{ node: tree[0], ancestors: [] }];
      while (queue.length > 0) {
        // 取出队列中的第一个节点和其祖先数组
        const { node, ancestors } = queue.shift();
        if (node.id === id) {
          // 找到目标节点,返回该节点及其祖先节点的数组
          return ancestors;
        }
        if (node.children && node.children.length > 0) {
          // 将当前节点添加到子节点的祖先数组中
          const newAncestors = [...ancestors, node];
          for (const child of node.children) {
            // 将子节点和新的祖先数组加入队列
            queue.push({ node: child, ancestors: newAncestors });
          }
        }
      }
      // 如果遍历完整个树都没有找到目标节点,返回空数组
      return [];
    }

 4、BFS 遍历树形结构 寻找对应id的节点

    /**
     * BFS遍历树形结构 寻找对应id的节点
     * @param {*} tree 树形结构
     * @param {*} id 节点id
     */
    getNode(tree, id) {
      const queue = [...tree];
      while (queue.length) {
        const node = queue.shift();
        if (node.id === id) return node;
        if (node.children?.length) {
          queue.push(...node.children);
        }
      }
      return null;
    }

5、BFS 遍历树结构 给节点某属性赋值

    /**
     * 遍历树结构 给节点某属性赋值 BFS
     * @param {*} tree 树形结构
     * @param {*} prop 属性
     * @param {*} value 值
     */
    traverseTreeSetProperty(tree, prop, value) {
      // 定义一个队列,用于存储待处理的节点
      const queue = [...tree];
      while (queue.length > 0) {
        // 出队列
        const node = queue.shift();
        // 给当前节点赋值
        node[prop] = value;
        // 将当前节点的子节点入队列
        if (node.children && node.children.length > 0) {
          queue.push(...node.children);
        }
      }
    }

6、BFS 计算树形结构的最大宽度

    /**
     * 计算树形结构的最大宽度 BFS
     * @param {*} tree 树形结构
     */
    getMaxWidth(tree) {
      if (!tree || tree.length === 0) {
        return 0;
      }
      let maxWidth = 0;
      let queue = [...tree];
      while (queue.length > 0) {
        const levelSize = queue.length;
        maxWidth = Math.max(maxWidth, levelSize);
        const nextLevel = [];
        for (let i = 0; i < levelSize; i++) {
          const node = queue[i];
          if (node.children && node.children.length > 0) {
            nextLevel.push(...node.children);
          }
        }
        queue = nextLevel;
      }
      return maxWidth;
    }

7、DFS 计算树形结构的最大深度

    /**
     * 计算树形结构的最大深度 DFS
     * @param {*} tree 树形结构
     */
    getMaxDepth(tree) {
      const dfs = (nodes) => {
        // 一级节点为空,层级则为0
        if (!nodes?.length) return 0;
        let maxDepth = 1;
        // eslint-disable-next-line
        for (const node of nodes) {
          const curDepth = dfs(node.children) + 1;
          maxDepth = Math.max(curDepth, maxDepth);
        }
        return maxDepth;
      }
      const treeHeight = dfs(tree)
      return treeHeight;
    }

8、DFS 寻找指定节点id对应的父级节点

    /**
     * 寻找指定节点id对应的父级节点
     * @param {*} tree
     * @param {*} nodeId
     */
    findParentByChildId(tree, nodeId) {
      let parentOfFirstChild = null;
      const dfs = (node, parent) => {
        if (parentOfFirstChild !== null) {
          return;
        }
        if (node.children && node.children.length > 0) {
          // eslint-disable-next-line
          for (const child of node.children) {
            dfs(child, node);
          }
        }
        // 找到对应节点后,返回其父节点
        if (node.id === nodeId) parentOfFirstChild = parent;
      }
      // eslint-disable-next-line
      for (const node of tree) {
        dfs(node, null);
      }
      return parentOfFirstChild
    }

9、DFS 寻找第一个叶子节点及对应的父节点

    /**
     * 寻找第一个叶子节点及叶子节点的父节点
     * @param {*} tree
     */
    findFirstChildAndParent(tree) {
      let firstChild = null;
      let parentOfFirstChild = null;
      const dfs = (node, parent) => {
        if (firstChild !== null) {
          return; // 如果已经找到了第一个子节点,则不再继续搜索
        }
        if (node.children && node.children.length > 0) {
          for (const child of node.children) {
            dfs(child, node);
          }
        } else {
          firstChild = node;
          parentOfFirstChild = parent;
        }
      }
      for (const node of tree) {
        dfs(node, null);
      }
      return {
        firstChild,
        parentOfFirstChild
      };
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/719183.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分数计算 中级题目

分数计算 中级题目&#xff1a;多个数参与的计算 参考答案&#xff1a;【仅供参考】CBBCCBCCCC

【语义分割系列】基于camvid数据集的Deeplabv3+分割算法(二)

基于camvid数据集的Deeplabv3+分割算法 前言 在前面的内容中,对比了Camvid数据集在基于不同backbone的Deeplabv3+算法上的效果。在这节内容中,本文将介绍在ghostnet的基础上,进一步优化效果,使得Miou提升。通过引入CFAC和CARAFE结构,有效地提升了模型的miou。 1.代码部…

国际期货投机交易的常见操作方法:

一、在开仓阶段&#xff0c;入市时机的选择&#xff1a; &#xff08;1&#xff09;通过基本分析法&#xff0c;判断市场处于牛市还是熊市 开仓阶段&#xff0c;入市时机的选择&#xff1a;当需求增加、供给减少&#xff0c;此时价格上升&#xff0c;买入期货合约&#xff1b…

Element-ui中Table表格无法显示

Element-ui中Table表格无法显示 在使用过程中发现样式正常显示但是table就是不显示&#xff0c;研究了一段时间后&#xff0c;发现问题是项目结构的问题 当你创建vue和安装el的时候&#xff0c;一定要注意进入到正确的项目文件夹&#xff0c;如果在外面也出现一个package.jso…

ARDUINO NRF24L01

连线 5v 3.3皆可 gnd Optimized high speed nRF24L01 driver class documentation: Optimized High Speed Driver for nRF24L01() 2.4GHz Wireless Transceiver 同时下载同一个程序 案例默认引脚ce ces &#xff0c;7&#xff0c;8 可以 修改为 9,10 安装库 第一个示例 两…

【driver8】

1.USB 2.磁盘缓存&#xff0c;页缓存 3.平均负载

传感器在智能家居中的应用

在物联网时代&#xff0c;智能家居成为人们生活中的重要组成部分。而传感器作为实现智能家居的基础设备&#xff0c;起到了关键的作用。不同类型的传感器能够获取环境中的各种参数&#xff0c;并通过物联网技术实现与智能家居系统的连接。例如&#xff0c;温度传感器可以实时监…

力扣每日一题 6/17 枚举+双指针

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 522.最长特殊序列II【中等】 题目&#xff1a; 给定字符串列表 strs &…

6.17作业

升级优化自己应用程序的登录界面。 要求&#xff1a; 1. qss实现 2. 需要有图层的叠加 &#xff08;QFrame&#xff09; 3. 设置纯净窗口后&#xff0c;有关闭等窗口功能。 4. 如果账号密码正确&#xff0c;则实现登录界面关闭&#xff0c;另一个应用界面显示。 //发送端头文件…

scratch3编程01-山地足球+射击游戏

目录 一&#xff0c;山地足球 1&#xff0c;基础&#xff08;需要的素材&#xff09; 1&#xff09;使用“重复执行直到”语句块 2&#xff09;使用“如果那么否则”语句 2&#xff0c;效果 3&#xff0c;sb3文件 一&#xff0c;击败小怪兽 1&#xff0c;基础&#xff0…

基于深度学习网络的USB摄像头实时视频采集与手势检测识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 系统架构 4.2 GoogLeNet网络简介 4.3 手势检测 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 训练过程如下&#xff1a; 将摄像头对准手势&#xff0c;然后进行…

HPC环境下文件流转最容易忽视的安全问题是什么?

半导体芯片设计企业将IC设计、仿真、验证过程上云&#xff0c;已成为越来越广泛的共识。企业使用HPC环境能满足 EDA 工作负载前端仿真百万随机 IO 小文件&#xff0c;后端仿真海量顺序读写大文件的高并发访问需求&#xff0c;简化 EDA 的工作流程&#xff0c;降低了仿真作业的时…

vue分类

先看效果 再看代码 <category-tab v-model"params.area" name"地区" :list"areaList" /><category-tab v-model"params.type" name"类型" :list"typeList" /><category-tab v-model"params.…

Semantic Kernel 中的流式输出SSE与Vue3前端接收示例

本文将介绍如何在使用 Semantic Kernel 框架的 ASP.NET 项目中使用流式输出 SSE&#xff08;Server-Sent Events&#xff09;&#xff0c;并展示如何在Vue3前端应用中接收这些数据。并介绍了如何使用 microsoft/fetch-event-source 库使用 POST 方法来接收 SSE 数据。 1. 背景 …

【单片机毕业设计选题24013】-基于STM32的城市垃圾分类引导系统

系统功能: 1、系统具有语音识别功能&#xff0c;可以对厨余垃圾、其他垃圾、有害垃圾、可回收垃圾进行语音识别&#xff1b; 2、系统可根据语音识别结果直接开启对应类别的垃圾桶&#xff0c;引导分类投放&#xff1b; 3、系统具有语音播报功能&#xff0c;可以语音播报出识…

Dapr分布式应用运行时初探2

Dapr是一个很优秀的分布式应用运行时&#xff0c;在本篇里我们来说一下Dapr的几个特色功能。 为了方便介绍&#xff0c;我简单画了个思维导图&#xff0c;如下所示&#xff1a; 众所周知&#xff0c;新技术的产生是为了解决现存的问题。从上面的思维图中我们可以了解下Dapr这…

【x264】滤波模块的简单分析

【x264】滤波模块的简单分析 1. 滤波模块概述1.1 自适应边界1.2 自适应样点级滤波器1.3 滤波过程 2. 函数入口&#xff08;fdec_filter_row&#xff09;2.1 去块滤波&#xff08;x264_frame_deblock_row&#xff09;2.1.1 强滤波函数&#xff08;deblock_edge_intra&#xff09…

FPGA - 滤波器 - IIR滤波器设计

一&#xff0c;IIR滤波器 在FPGA - 滤波器 - FIR滤波器设计中可知&#xff0c;数字滤波器是一个时域离散系统。任何一个时域离散系统都可以用一个N阶差分方程来表示&#xff0c;即&#xff1a; 式中&#xff0c;x(n)和y(n)分别是系统的输入序列和输出序列&#xff1b;aj和bi均为…

vue简介实例

先看样式 再看代码 <div v-else class"relative mt-4 h-44 cursor-pointer overflow-hidden rounded-xl"><divclass"absolute flex h-44 w-full blur-lg":style"{ backgroundImage: url(${currentSongList.list[0]?.coverImgUrl}) }"…

jpg压缩在线方法,我只用这2种(无损)

在数字化的时代&#xff0c;我们经常需要分享、存储或上传各种图像文件&#xff0c;而JPG是其中最常见的图像格式之一。然而&#xff0c;大文件大小有时可能成为一个问题&#xff0c;尤其是在网络传输或存储空间有限的情况下。为了解决这一问题&#xff0c;我们可以利用在线工具…