算法面试题--树与对象数组的转化

news2024/10/5 21:17:36

1. Array -> Tree

var arr = [
  { id: 12, parentId: 1, name: "朝阳区" },
  { id: 241, parentId: 24, name: "田林街道" },
  { id: 31, parentId: 3, name: "广州市" },
  { id: 13, parentId: 1, name: "昌平区" },
  { id: 2421, parentId: 242, name: "上海科技绿洲" },
  { id: 21, parentId: 2, name: "静安区" },
  { id: 242, parentId: 24, name: "漕河泾街道" },
  { id: 22, parentId: 2, name: "黄浦区" },
  { id: 11, parentId: 1, name: "顺义区" },
  { id: 2, parentId: 0, name: "上海市" },
  { id: 24, parentId: 2, name: "徐汇区" },
  { id: 1, parentId: 0, name: "北京市" },
  { id: 2422, parentId: 242, name: "漕河泾开发区" },
  { id: 32, parentId: 3, name: "深圳市" },
  { id: 33, parentId: 3, name: "东莞市" },
  { id: 3, parentId: 0, name: "广东省" },
];

function arrayToTreeV3(arr, root) {
  return arr
    .filter((item) => item.parentId === root)
    .map((item) => ({ ...item, children: arrayToTreeV3(arr, item.id) }));
}
let test = arrayToTreeV3(arr, 0);

2. Tree -> Array

const treeData = [
  {
    id: 2,
    title: "中国",
    parent_id: 0,
    children: [
      {
        id: 3,
        title: "广东省",
        parent_id: 2,
        children: [
          {
            id: 4,
            title: "广州市",
            parent_id: 3,
            children: [{ id: 5, title: "天河区", parent_id: 4 }],
          },
        ],
      },
      { id: 6, title: "湖南省", parent_id: 2 },
    ],
  },
  { id: 1, title: "俄罗斯", parent_id: 0 },
];

function treeToList(data) {
  let res = [];
  const dfs = (tree) => {
    tree.forEach((item) => {
      if (item.children) {
        dfs(item.children);
        delete item.children;
      }
      res.push(item);
    });
  };
  dfs(data);
  return res;
}
let testarr = treeToList(treeData);

3.Tree 查找路径(id)

function parseTreePath(tree, id, path = "") {
  for (let i = 0; i < tree.length; i++) {
    let tempPath = path;
    // 避免出现在最前面的/
    tempPath = `${tempPath ? tempPath + "/ " : tempPath}${tree[i].title}`;
    if (tree[i].id == id) return tempPath;
    else if (tree[i].children) {
      let reuslt = parseTreePath(tree[i].children, id, tempPath);
      if (reuslt) return reuslt;
    }
  }
}
console.log(parseTreePath(treeData, 5));

4. 树的深度优先遍历

思想:访问该元素后,如果该元素存在子元素,则访问该元素的第一个子元素,如果不存在,则访问该元素的兄弟节点(即退出该函数,返回上一层函数,访问上一层中未被访问的子元素),重复此操作。

//         a
//    b         c
//c d e f    g h i

const dfs = root => {
    if(!root) return;
    console.log(root.val);
    root.children.forEach(child => {
        dfs(child)
    })
}

dfs( treeData)
// a b d e f c g h i

5. 广度优先遍历

思想:访问该元素后,如果该元素存在兄弟节点,则依次访问该元素的兄弟节点,如果不存在,则访问该元素的孩子节点

//         a
//    b         c
//c d e f    g h i

const bfs = root => {
    if(!root) return;
    const queue = [root];
    while(queue.length) {
        const top = queue.shift();
        console.log(top.val);
        top.children.forEach(child => {
            queue.push(child)
        })
    }
}

bfs( treeData)
// a b c d e f g h i

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java核心知识点整理大全24-笔记

22. 数据结构 22.1.1. 栈&#xff08;stack&#xff09; 栈&#xff08;stack&#xff09;是限制插入和删除只能在一个位置上进行的表&#xff0c;该位置是表的末端&#xff0c;叫做栈顶 &#xff08;top&#xff09;。它是后进先出&#xff08;LIFO&#xff09;的。对栈的基…

2023.11.12 阿里云产品全线故障

阿里云 11.12 故障原因曝光&#xff1a;访问密钥服务 (Access Key) 异常 (baidu.com) 故障原因竟然是因为生成白名单代码逻辑缺陷。

皮肤警告,羊大师讲解身体与环境的默契

皮肤警告&#xff0c;羊大师讲解身体与环境的默契 我们常常忽视身体皮肤所承受的压力和警告信号。皮肤是身体的第一道屏障&#xff0c;也是与外界环境直接接触的组织。我们的皮肤通过各种方式向我们传达信息&#xff0c;警告我们关于身体健康的重要问题。本文小编羊大师将带大…

堆栈_队列实现栈

//请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 // // 实现 MyStack 类&#xff1a; // // // void push(int x) 将元素 x 压入栈顶。 // int pop() 移除…

外汇天眼:CFTC修订了针对Logista Advisors的投诉

商品期货交易委员会&#xff08;CFTC&#xff09;修改了对Logista Advisors LLC及其首席执行官Andrew Harris Serotta的投诉。修改后的投诉于2023年11月28日提交给伊利诺伊州北区法院。 修改后的投诉声称&#xff0c;从至少2020年1月左右至少到2020年4月左右&#xff0c;Logis…

whatsapp信息群发脚本开发!

WhatsApp 作为全球广受欢迎的通讯应用&#xff0c;在我们的日常生活中扮演着重要角色&#xff0c;有时候&#xff0c;我们需要向大量联系人发送消息&#xff0c;比如营销推广、活动通知等。 一个个手动发送消息?那简直太落后了!今天&#xff0c;我们将探讨如何利用脚本开发实…

使用JAVA语言写一个排队叫号的小程序

以下是一个简单的排队叫号的小程序&#xff0c;使用JAVA语言实现。 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class NumberingSystem {public static void main(String[] args) {Queue<String> queue new LinkedList<…

探索使用Quarkus和MicroProfile 构建Kubernetes原生微服务的秘诀!

Kubernetes Native Microservices with Quarkus and MicroProfile 是一个基于Kubernetes原生微服务的开发框架&#xff0c;它结合了Quarkus和MicroProfile的优点&#xff0c;提供了一个高效、可扩展、易于管理的微服务解决方案。 Quarkus是一个针对Java虚拟机&#xff08;JVM&…

企业计算机服务器中了mallox勒索病毒如何解密,mallox勒索病毒文件恢复

随着网络技术的不断发展&#xff0c;网络安全威胁也在不断增加&#xff0c;勒索病毒攻击企业计算机服务器的事件时有发生&#xff0c;并且勒索病毒的加密形式也越来越复杂。近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mallox…

配电室无人值守方案

配电室无人值守一种应用先进技术实现配电室自动化运行、实时远程监控和管理的解决方案。力安科技配电室无人值守&#xff0c;加装小安值班机器人或边缘网关&#xff0c;完成配电室智能化升级&#xff0c;依托电易云&#xff0c;构建智慧配电室及运维系统。 设备选型和安装&…

数据结构-04-队列

1-队列的结构和特点 生活中我们排队买票&#xff0c;先来的先买&#xff0c;后来的人只能站末尾&#xff0c;不允许插队。先进者先出&#xff0c;这就是典型的"队列"。队列跟栈非常相似&#xff0c;支持的操作也很有限&#xff0c;最基本的操作也是两个&#xff1a;入…

问题记录-maven依赖升级或替换(简单版)

问题背景 项目被检测到有高危漏洞&#xff0c;需要对部分jar进行升级。以一个jar为例记录一下升级过程。 1 找到高危漏洞的包 如果装了maven helper插件则可以在下面查看当前模块依赖包 2 使用maven命令 执行下面这个命令&#xff0c;会将当前项目的信息打印出来&#xff0c;…

只有stm32基础,学嵌入式linux得几年?

只有stm32基础&#xff0c;学嵌入式linux得几年&#xff1f; 你这几句话基本把好几个方向都说了个遍&#xff0c;但是实际你没有这么多精力 这里32的基础意义不大&#xff0c;主要是C语言基础和之前项目中的经验&#xff0c;要是这俩个都不错&#xff0c;你可以直接上手 linux&…

统信UOS之UOS ID云服务

原文链接&#xff1a;统信UOS桌面操作系统1060上使用UOS ID hello&#xff0c;大家好啊&#xff01;在这个数字化、智能化的时代&#xff0c;操作系统不仅仅是简单的软件平台&#xff0c;更是我们日常工作和生活的得力助手。今天&#xff0c;我要给大家介绍的是关于统信UOS桌面…

led护眼灯真的能护眼吗??央视公认好用的五款护眼台灯推荐

2020年我国的近视人数将达到7亿人左右&#xff0c;我国的儿童年少年为主要的近视人群。5岁-15岁群体近视患病率高达到约78.96%&#xff0c;16岁-24岁群体近视患病率高达到约95%。我国儿童青少年近视患病率居高不下&#xff0c;会降低我国未来的人口素质与国民健康素质&#xff…

代码随想录算法训练营第五十一天【动态规划part12】 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路 动规五部曲 1.确定dp数组及其下标含义&#xff1a; 第i天&#xff0c;状态为j&#xff0c;所剩的最多现金为dp[i][j]。 出现冷冻期后&#xff…

熟练运用这些黑盒测试知识点,月薪翻倍不是难题

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

layui提示框没有渲染bug解决

bug&#xff1a;使用layui时或许是依赖导入又或是ideal和浏览器缓存问题导致前面明明正常的页面显示&#xff0c;后面出现提示框没有css样式&#xff0c;弹出框没有背景css 效果如下 解决后 解决方法 在你的代码中引入layer.js 我这是jsp页面 <script type"text/jav…

PDF文件如何限制打印?限制打印清晰度?

想要限制PDF文件的打印功能&#xff0c;想要限制PDF文件打印清晰度&#xff0c;都可以通过设置限制编辑来达到目的。 打开PDF编辑器&#xff0c;找到设置限制编辑的界面&#xff0c;切换到加密状态&#xff0c;然后我们就看到 有印刷许可。勾选【权限密码】输入一个PDF密码&am…

适配器模式-C++实现

适配器是一种结构型设计模式&#xff0c;用于将一个接口转换为另一个客户端所需要的接口。该模式通过创建一个适配器对象&#xff0c;使不兼容的接口可以协同工作。 适配器模式主要分为三个角色&#xff1a;适配器类、目标类、适配者类。 适配器模式分为对象适配器和类适配器…