题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof
相似题目:
23.二叉搜索树的后序遍历序列考察对后序遍历的理解
解题思路:
- 此题考查对先序遍历及中序遍历的理解,我们可以发现对于先序遍历来说其第一个值一定为二叉树的根节点
- 此根节点将中序遍历分为左右子树,所以我首先找到中序遍历对应的根节点的索引 i
- 左子树为先序遍历的(1,i+1),中序遍历的(0,i),右子树为先序遍历的(i+1, length-1),中序遍历的(i+1,length-1);
- 时间复杂度为O(n)所有的节点都要被创建
解题代码:
var buildTree = function(preorder, inorder) {
if(!preorder.length || !inorder.length) return null;
const root = new TreeNode(preorder[0]);
let i = 0;
for(;i<inorder.length;i++) {
if(preorder[0] === inorder[i]) {
break;
}
}
root.left = buildTree(preorder.slice(1,i+1),inorder.slice(0,i));
root.right = buildTree(preorder.slice(i+1),inorder.slice(i+1));
return root;
};