跳到主要内容

106.从中序与后序遍历序列构造二叉树

· 阅读需 2 分钟

1、题干

给定两个整数数组 inorderpostorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

 

示例 1:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]

示例 2:

输入:inorder = [-1], postorder = [-1]
输出:[-1]

 

提示:

  • 1 <= inorder.length <= 3000
  • postorder.length == inorder.length
  • -3000 <= inorder[i], postorder[i] <= 3000
  • inorder 和 postorder 都由 不同 的值组成
  • postorder 中每一个值都在 inorder 中
  • inorder 保证是树的中序遍历
  • postorder 保证是树的后序遍历

2、思路

后序遍历数组最后一个元素是根节点,中序遍历数组中根节点前、后两边分别是左子树与右子树,根据这两个性质递归即可,时间复杂度最优 O(nlogn)O(n\log{n}),最差 O(n2)O(n^2)

3、代码

function buildTree(inorder: number[], postorder: number[]): TreeNode | null {
if (!inorder.length) return null;

const rv = postorder.at(-1);
const root = new TreeNode(rv);

const c = inorder.indexOf(rv);

const inLeft = inorder.slice(0, c);
const inRight = inorder.slice(c + 1);

const postLeft = postorder.slice(0, c);
const postRight = postorder.slice(c, postorder.length - 1);

root.left = buildTree(inLeft, postLeft);
root.right = buildTree(inRight, postRight);

return root;
}