Skip to content

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

难度:⭐⭐

解题关键词:二叉树

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

typescript
function buildTree(inOrder: number[], postOrder: number[]): TreeNode | null {
  // 如果序列为空,返回 null
  if (!inOrder.length) return null;
  // 找到中节点
  const mid = postOrder[postOrder.length - 1];

  const root = new TreeNode(mid);

  // 找到中间节点在中序遍历中的位置
  const index = inOrder.findIndex((item) => item === mid);
  // 根据中间节点位置进行切割左右中序序列
  const leftInOrder = inOrder.slice(0, index);
  const rightInOrder = inOrder.slice(index + 1);

  // 根据左序列长度切割后序序列
  const leftPostOrder = postOrder.slice(0, leftInOrder.length);
  const rightPostOrder = postOrder.slice(leftInOrder.length, -1);

  // 递归构造左右子树
  root.left = buildTree(leftInOrder, leftPostOrder);
  root.right = buildTree(rightInOrder, rightPostOrder);

  return root;
}