返回

无父子级的树形结构与扁平化结构互转(JavaScript)

前端

前言

在计算机科学中,树形结构是一种重要的数据结构,它可以用来表示具有层次关系的数据。树形结构由节点和边组成,节点表示数据元素,边表示节点之间的关系。扁平化结构是一种特殊形式的树形结构,其中所有的节点都在同一层上,没有层次关系。

在某些情况下,我们需要将树形结构转换为扁平化结构,以便于处理或存储数据。例如,当我们需要将数据存储在关系数据库中时,通常需要将树形结构转换为扁平化结构。

在 JavaScript 中,我们可以使用递归或迭代的方法来将树形结构转换为扁平化结构。

递归方法

递归是一种解决问题的经典方法,它通过将问题分解为更小的子问题来解决问题。在 JavaScript 中,我们可以使用递归的方法来将树形结构转换为扁平化结构。

以下是如何使用递归方法将树形结构转换为扁平化结构的步骤:

  1. 创建一个空数组来存储扁平化后的数据。
  2. 遍历树形结构中的每个节点。
  3. 将当前节点的数据添加到扁平化数组中。
  4. 如果当前节点有子节点,则递归地调用步骤 2 和步骤 3。
  5. 重复步骤 2 到步骤 4,直到遍历完整个树形结构。

以下是一个使用递归方法将树形结构转换为扁平化结构的示例代码:

function flattenTree(tree) {
  const flattenedArray = [];

  function flattenNode(node) {
    flattenedArray.push(node.data);
    if (node.children) {
      node.children.forEach(child => flattenNode(child));
    }
  }

  flattenNode(tree);

  return flattenedArray;
}

迭代方法

迭代是一种解决问题的另一种经典方法,它通过重复执行一个过程来解决问题。在 JavaScript 中,我们可以使用迭代的方法来将树形结构转换为扁平化结构。

以下是如何使用迭代方法将树形结构转换为扁平化结构的步骤:

  1. 创建一个空数组来存储扁平化后的数据。
  2. 创建一个栈来存储要遍历的节点。
  3. 将根节点压入栈中。
  4. 循环执行以下步骤,直到栈为空:
    • 将栈顶节点弹出并将其数据添加到扁平化数组中。
    • 如果当前节点有子节点,则将子节点压入栈中。
  5. 重复步骤 4,直到栈为空。

以下是一个使用迭代方法将树形结构转换为扁平化结构的示例代码:

function flattenTree(tree) {
  const flattenedArray = [];
  const stack = [];

  stack.push(tree);

  while (stack.length > 0) {
    const node = stack.pop();
    flattenedArray.push(node.data);
    if (node.children) {
      node.children.forEach(child => stack.push(child));
    }
  }

  return flattenedArray;
}

将扁平化结构转换为树形结构

在某些情况下,我们需要将扁平化结构转换为树形结构。例如,当我们需要将数据从关系数据库中加载到内存中时,通常需要将数据转换为树形结构。

在 JavaScript 中,我们可以使用递归或迭代的方法来将扁平化结构转换为树形结构。

以下是如何使用递归方法将扁平化结构转换为树形结构的步骤:

  1. 创建一个空树形结构。
  2. 遍历扁平化结构中的每个数据元素。
  3. 将当前数据元素添加到树形结构中。
  4. 如果当前数据元素有父节点,则递归地调用步骤 2 和步骤 3。
  5. 重复步骤 2 到步骤 4,直到遍历完整个扁平化结构。

以下是一个使用递归方法将扁平化结构转换为树形结构的示例代码:

function buildTree(flattenedArray) {
  const tree = {};

  function buildNode(data, parent) {
    const node = {
      data: data,
    };

    if (parent) {
      parent.children.push(node);
    } else {
      tree = node;
    }

    return node;
  }

  for (let i = 0; i < flattenedArray.length; i++) {
    const data = flattenedArray[i];
    const parent = i > 0 ? flattenedArray[i - 1] : null;

    buildNode(data, parent);
  }

  return tree;
}

以下是如何使用迭代方法将扁平化结构转换为树形结构的步骤:

  1. 创建一个空树形结构。
  2. 创建一个映射来存储每个数据元素的父节点。
  3. 遍历扁平化结构中的每个数据元素。
  4. 将当前数据元素添加到树形结构中。
  5. 如果当前数据元素有父节点,则将当前数据元素添加到父节点的子节点数组中。
  6. 重复步骤 4 和步骤 5,直到遍历完整个扁平化结构。

以下是一个使用迭代方法将扁平化结构转换为树形结构的示例代码:

function buildTree(flattenedArray) {
  const tree = {};
  const parentMap = {};

  for (let i = 0; i < flattenedArray.length; i++) {
    const data = flattenedArray[i];
    const parent = i > 0 ? flattenedArray[i - 1] : null;

    const node = {
      data: data,
    };

    if (parent) {
      parentMap[data] = parent;
    } else {
      tree = node;
    }
  }

  for (const data in parentMap) {
    const parent = parentMap[data];
    const node = {
      data: data,
    };

    parent.children.push(node);
  }

  return tree;
}

结论

树形结构和扁平化结构都是非常重要的数据结构,它们在计算机科学中都有着广泛的应用。在 JavaScript 中,我们可以使用递归或迭代的方法来将树形结构转换为扁平化结构,也可以将扁平化结构转换为树形结构。这些转换技巧可以帮助我们有效地处理复杂的数据结构。