输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
限制:
0 <= 节点个数 <= 5000
思路:
前序遍历的第一个就是树的根节点,然后找中序遍历,在中序遍历里从第一个到根节点就是左子树,根节点到最后一个就是右子树。然后目标就是找到根节点,然后拆出左右子树。
然后继续递归就可以了
function buildTree(
preorder: number[],
inorder: number[]
): TreeNode | null {
if(!preorder.length || !inorder.length) return null;
const root: TreeNode = new TreeNode(preorder.shift());
const val: number = root.val;
const idx = inorder.indexOf(val);
const left = inorder.slice(0, idx);
const right = inorder.slice(idx + 1);
root.left = buildTree(preorder, left);
root.right = buildTree(preorder, right)
return root;
};