返回

漫步数据结构森林:由遍历序列/数组/链表生成二叉树类型总结 [JavaScript 解法]

前端

踏入数据结构的奇异世界,我们将踏上一段探索二叉树类型生成奥秘的旅程。从遍历序列、数组和链表的纷繁复杂中,我们将揭开构建这些数据结构的迷人方法。用 JavaScript 作为我们的向导,我们将深入挖掘每种类型,揭示其独特之处,并提供清晰的示例代码来照亮您的理解之路。

遍历序列构建二叉树

遍历序列为我们提供了一棵二叉树的先序、中序或后序遍历结果。有了这些线索,我们可以通过递归和巧妙的技巧重建原始树。让我们深入挖掘每种遍历类型:

先序遍历

  • 序列的第一个元素为根节点。
  • 递归地将序列分为左子树和右子树。
  • 分别根据左子树和右子树的先序遍历序列递归地构建子树。

中序遍历

  • 序列的中点元素为根节点。
  • 递归地将序列分为左子树和右子树。
  • 根据左子树的中序遍历序列递归地构建左子树。
  • 根据右子树的中序遍历序列递归地构建右子树。

后序遍历

  • 序列的最后一个元素为根节点。
  • 递归地将序列分为左子树和右子树。
  • 根据右子树的后序遍历序列递归地构建右子树。
  • 根据左子树的后序遍历序列递归地构建左子树。

数组构建二叉树

数组可以转换为一棵完全二叉树,其中每个节点都有一个左子节点和一个右子节点。从根节点开始,我们可以根据数组中的元素逐层构建树:

  1. 根节点位于数组的第一个索引处。
  2. 左子节点位于当前索引的 2 倍索引处。
  3. 右子节点位于当前索引的 2 倍索引处 + 1。

链表构建二叉树

链表为我们提供了一个更具挑战性的线索,需要巧妙的算法来构建二叉树。让我们探索两种流行的方法:

中序遍历法

  1. 找到链表的中间节点作为根节点。
  2. 递归地将左半部分转换为左子树。
  3. 递归地将右半部分转换为右子树。

莫里斯遍历法

  1. 使用一个指针来遍历链表。
  2. 当指针指向某个节点时,如果该节点没有右子节点,则将其设为该节点的右子节点。
  3. 如果该节点有右子节点,则继续遍历链表,直到指针指向该节点的右子节点。
  4. 将指针指向该节点的右子节点,然后重复第 2 步。

JavaScript 示例

以下是通过中序遍历序列生成二叉树的 JavaScript 示例:

function buildTree(inorder) {
  if (!inorder || inorder.length === 0) return null;

  const rootValue = inorder[Math.floor(inorder.length / 2)];
  const root = new TreeNode(rootValue);

  const leftInorder = inorder.slice(0, Math.floor(inorder.length / 2));
  const rightInorder = inorder.slice(Math.floor(inorder.length / 2) + 1);

  root.left = buildTree(leftInorder);
  root.right = buildTree(rightInorder);

  return root;
}

拥抱探索与创新

踏入数据结构的迷人世界,每个角落都充满了探索和创新的可能。继续深入研究各种二叉树类型及其生成方法,扩宽您的知识边界。