难度中等
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
限制:
0 <= 节点个数 <= 5000
注意:本题与主站 105 题重复:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
这道题首先要学会前序遍历、中序遍历是怎么一回事,然后用递归的方式还原出一棵树
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {number[]} preorder
* @param {number[]} inorder
* @return {TreeNode}
*/
var buildTree = function(preorder, inorder) {
let n = preorder.length;
if(preorder==null||inorder==null){
return null;
}
function ConstructCore(prestart,preend,instart,inend){
if (prestart > preend) return null;
let prerootindex = prestart;
let inrootindex = map.get(preorder[prerootindex]);
const root = new TreeNode(preorder[prerootindex],null,null);
let sizeleftsub = inrootindex-instart;
root.left = ConstructCore(prestart+1,prestart+sizeleftsub,instart,inrootindex-1);
root.right= ConstructCore(prestart+sizeleftsub+1,preend,inrootindex+1,inend);
return root;
}
const map=new Map();
for(let i=0;i<n;i++){
map.set(inorder[i],i);
}
//前序遍历的两个指针和中序遍历的两个指针
return ConstructCore(0,n-1,0,n-1);
};