重构二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
分析
- 根据前序序列可以知道其第一个结点就是二叉树的根结点
- 然后根据该根节点找到它在中序序列中的位置
- 于是我们可以将 中序序列 分为左右子树 根节点左边的为左子树 根结点右边为右子树
- 知道了中序序列的左右子树之后,我们可以 得到左右子树的长度,在前序序列中也进行一个左右子树的划分
- 最后分别对左右子树进行递归
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function reConstructBinaryTree(pre, vin)
{
// write code here
if(pre.length === 0 || vin.length === 0){
return null;
}
var node = new TreeNode(pre[0]);//根节点
var index = vin.indexOf(pre[0]);//根节点在中序序列中的位置
node.left = reConstructBinaryTree(pre.slice(1,index+1),vin.slice(0,index));
node.right = reConstructBinaryTree(pre.slice(index+1),vin.slice(index+1));
return node;
}