题目:
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如:
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
解题思路:首先通过前序遍历结果获取根节点(前序遍历的第一个值就是树的根节点),然后通过中序遍历区分左右子树,再分别对左右子树重复上述操作。
/**
* 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) {
if (!preorder.length || !inorder.length) return null
var rootValue = preorder[0]; //获取根节点的值
var root = new TreeNode(rootValue); //构建二叉树的根节点
var index = inorder.indexOf(rootValue);
var leftLDR = inorder.slice(0,index);//左边的中序遍历
var leftDLR = preorder.slice(1,leftLDR.length+1) ;//左边的前序遍历
root.left = buildTree(leftDLR,leftLDR);
var rightLDR = inorder.slice(index+1);//右边的中序遍历
var rightDLR = preorder.slice(leftLDR.length+1);//右边的前序遍历
root.right = buildTree(rightDLR,rightLDR);
return root;
};