Skip to content

力扣链接:105.从前序与中序遍历序列构造二叉树

难度:⭐⭐

解题关键词:二叉树

解题思路:根据前序序列拿到根节点,然后基于根节点去切割中序序列,得到左右子树,然后拿左子树的 size 去切割前序序列,之后使用递归创建根节点的左右子树即可。

typescript
function buildTree(preOrder: number[], inOrder: number[]): TreeNode | null {
  // 如果前序序列为空,直接返回 null
  if (!preOrder.length) return null;

  // 找到根节点
  const mid = preOrder[0];

  // 创建根节点
  const root = new TreeNode(mid);

  // 找到根节点在中序序列中位置,然后基于这个位置取切割数组
  const midIndexInInOrder = inOrder.findIndex((item) => item === mid);
  // 根节点左子树的中序序列
  const leftInOrder = inOrder.slice(0, midIndexInInOrder);
  // 根节点右子树的中序序列
  const rightInOrder = inOrder.slice(midIndexInInOrder + 1);

  // 根节点左子树的前序序列
  const leftPreOrder = preOrder.slice(1, 1 + leftInOrder.length);
  // 根节点右子树的前序序列
  const rightPreOrder = preOrder.slice(1 + leftInOrder.length);

  // 递归创建根节点的左右子树
  root.left = buildTree(leftPreOrder, leftInOrder);
  root.right = buildTree(rightPreOrder, rightInOrder);

  return root;
}