问题描述
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/
9 20
/
15 7
代码
var buildTree = function(preorder, inorder) {
if( !preorder.length || !inorder.length){
return null;
}
const rootVal = preorder[0];
const node = new TreeNode(rootVal);
let i=0
for( ; i<inorder.length-1 ; i++){
if( inorder[i] === rootVal){
break;
}
}
node.left = buildTree( preorder.slice(1,i+1),inorder.slice(0,i));
node.right = buildTree( preorder.slice(i+1),inorder.slice(i+1));
return node;
};
注意事项
1.问题采用递归的方式解决的,找到根节点在中序遍历中的下标之后,对原本的前序、中序遍历进行切割,再继续向左右子树调用buildTree函数,当左右子树有其一为空则向上递归,返回根节点。
2.每一次调用buildTree都会进行新一次的左右结点的调用,当node.left结束从底层返回结果时,要继续执行node.right,最后执行return node,如果此时返回的不是最终的根节点,则继续向上返回。
3. .slice()方法,第一个参数是切割的起始位置,第二个参数是需要切割的数后一位。