思路:
首先 前序遍历 是 根节点->左节点->右节点
中序遍历 是 左节点->根节点->右节点
因此 我们前序遍历的第一个节点是根节点(root node),因为题目中说了不会有重复的数字,
所以我们可以通过 root node节点在中序遍历中的索引(index),
其中对于中序遍历来说,(0,index-1)都是左子树,(index+1, length-1)都是右子树
对于前序遍历来说,(1,中序遍历左子树的长度) 都是左子树,(中序遍历左子树的长度+1,...) 都是右子树.
此时我们就可以递归寻找左子树的根节点 和 右子树的根节点 直到子树的长度==1的时候,该节点就是叶子节点
function resTree(pre,middle){
let result = null
if(pre.length > 1){
let root = pre[0]
let index = middle.indexOf(root)
let middleLeft = middle.slice(0,index)
let middleRight = middle.slice(index+1)
pre.shift()
let preLeft = pre.slice(0,middleLeft.length)
let preRight = pre.slice(middleLeft.length)
result = {
val:root,
left: resTree(preLeft,middleLeft),
right:resTree(preRight,middleRight)
}
}else if(pre.length === 1){
result = {
val:pre[0],
left:null,
right:null
}
}
return result
}