数组转树与树转数组的方法
2024.01.08 05:39浏览量:9简介:介绍如何将数组转换为树形结构以及如何将树形结构转换为数组的方法。
在计算机科学中,数组和树形结构是两种常见的数据结构。数组是一维或多维的线性数据结构,而树形结构则是一种层次结构,用于表示具有层次关系的数据。在某些情况下,我们需要将数组转换为树形结构,或者将树形结构转换为数组。下面将介绍这两种转换方法。
一、数组转树
数组转树的常见场景是处理具有层次关系的数据,例如文件系统、组织结构等。下面是一个简单的示例,演示如何将一个表示家族关系的数组转换为树形结构:
// 原始数组
const array = [
{ id: 1, parentId: null },
{ id: 2, parentId: 1 },
{ id: 3, parentId: 1 },
{ id: 4, parentId: 2 },
{ id: 5, parentId: 2 },
{ id: 6, parentId: 3 }
];
// 转换函数
function arrayToTree(array) {
const map = {}; // 用于存储数组元素的映射关系
const tree = []; // 用于存储转换后的树形结构
// 将数组元素添加到映射关系中
array.forEach((item) => {
map[item.id] = item;
});
// 递归构建树形结构
function buildTree(parentId) {
const parent = map[parentId];
if (!parent) return;
const children = array.filter((item) => item.parentId === parentId);
parent.children = children.map((child) => buildTree(child.id));
tree.push(parent);
}
// 从根节点开始构建树形结构
buildTree(null);
return tree;
}
// 使用示例
const tree = arrayToTree(array);
console.log(tree); // 输出转换后的树形结构
在这个示例中,我们首先创建了一个映射关系 map
,用于存储原始数组元素的引用。然后,我们定义了一个递归函数 buildTree
,该函数根据给定的父节点 ID 构建子节点。在构建过程中,我们通过过滤原始数组来获取当前节点的子节点,并递归地构建子节点的子节点。最后,我们将根节点添加到树形结构中并返回整个树形结构。
二、树转数组
将树形结构转换为数组的常见场景是存储或传输数据。下面是一个简单的示例,演示如何将一个表示文件系统的树形结构转换为数组:
```javascript
// 树形结构
const tree = [
{ id: 1, name: ‘根目录’, children: [2, 3] },
{ id: 2, name: ‘文件1’, children: [] },
{ id: 3, name: ‘文件夹1’, children: [4, 5] },
{ id: 4, name: ‘文件2’, children: [] },
{ id: 5, name: ‘文件3’, children: [] }
];
// 转换函数
function treeToArray(tree) {
const array = []; // 用于存储转换后的数组元素
const stack = [{ children: tree }]; // 用栈来模拟递归过程,初始时将根节点入栈
while (stack.length > 0) {
const item = stack.pop(); // 出栈操作,获取当前节点及其子节点信息
const { id, name, children } = item.children[0]; // 获取当前节点的信息(假设每个节点只有一个子节点)
array.push({ id, name }); // 将当前节点信息添加到数组中
if (children && children.length > 0) { // 将子节点入栈,以便后续处理子节点的子节点等递归操作))))))))))))))))))))))))))// ————————————————————————————————————————————-
发表评论
登录后可评论,请前往 登录 或 注册