力扣链接: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;
}