LeetCode之从前序和中序序列中构造二叉树

53 阅读1分钟

原题链接


根据中序和前序遍历的特点来解开此题。 在前序遍历中可找到根节点,而在中序遍历中可以根据根节点来确定该根节点的左右子树

var buildTree = function(preorder, inorder) {
//设置map的原因:在前序遍历中找到根节点后,
//我需要拿到这个根节点在中序遍历中的位置,好确定该节点对应的左右子树
let map=new Map()
for(let i=0;i<inorder.length;i++){
map.set(inorder[i],i)
}

//递归函数
function back(preorder,inorder,pLeft,pRight,iLeft,iRight)
{
if(pLeft>pRight||iLeft>iRight){
return null
}
//首先拿到该序列的根节点(根节点是前序序列的第一个)   这个是根节点具体值
let val=preorder[pLeft]
//找到中序遍历该节点的位置    //这个是根节点在中序遍历的索引
let in_root=map.get(preorder[pLeft])

//根据索引可以确定根节点的左子树数量
let left_num=in_root-iLeft

//创建这个根节点
let node=new TreeNode(val)
node.left=back(preorder,inorder,pLeft+1,pLeft+left_num,iLeft,in_root-1)
node.right=back(preorder,inorder,pLeft+left_num+1,pRight,in_root+1,iRight)
return root
}


//调用函数
return back(preorder,inorder,0,preorder.length-1,0,inorder.length-1)
}
}