题目
输入某二叉树的前序遍历和中序遍历的结果,重建该二叉树。
分析
我们以一个具体序列进行分析
前序遍历序列 {1,2,4,7,3,5,6,8}
中序遍历序列 {4,7,2,1,5,3,8,6}
前序遍历的第一个数字1是根节点的值。然后扫描中序遍历序列,就能找到根节点在中序遍历序列中的位置。该位置之前的3个元素{4,7,2}都是左子树上的,之后的4个元素{5,3,8,6}都是右子树上的。因此可以在前序遍历序列中找到左子树的前序遍历序列,即{2,4,7},右子树的前序遍历序列{3,5,6,8}。
通过分析我们已经找到了左右子树的前序遍历序列和中序遍历序列,我们可以使用通用的方法再构建相应的左右子树,即我们可以使用递归的方法来完成。
代码
public TreeNode binaryTreeConstruct(int[] pre,int startPre,int endPre,int[] in,
int startIn, int endIn)
{
if(startPre > endPre || startIn > endIn) {
return null;
}
TreeNode root = new TreeNode(pre[startPre]);
for(int i = startIn;i<=endIn;i++){
if(in[i] == pre[startPre]){
// i-startIn表示左子树的节点的个数
root.left = binaryTreeConstruct(pre,startPre+1,startPre+i-startIn,
in,startIn,i-1);
root.right = binaryTreeConstruct(pre,startPre+1+i-startIn,endPre,in,i+1,endIn);
break;
}
}
return root;
}