题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路分析:
该题是二叉树问题,我们首先想到的就是用递归的方法去解决该问题,我们知道二叉树的先序遍历,数组的首元素一定是该二叉树的根节点,因此我们可以先确定根节点,然后中序遍历是先访问左子树然后访问根,最后访问右子树。因此当我们通过先序遍历确定根节点后,在中序序列中搜索找到根节点,那么此时中序序列中根节点左边的所有节点构成了二叉树当前根节点左子树的中序序列,右边是右子树的中序序列,同理可以在先序序列中找到左子树的先序序列和右子树的先序序列,这样我们就将问题的规模缩小到了重构左右子树,因此我们可以用递归的方法解决该问题。
代码:
import java.util.*;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre==null||in==null||pre.length==0||in.length==0) //递归终止条件
return null;
TreeNode root=new TreeNode(pre[0]); //找到根节点
int i=0;
for(;i<in.length;i++){
if(in[i]==pre[0])
break;
}
int []leftpre=Arrays.copyOfRange(pre,1,i+1); //左子树先序序列
int []leftin=Arrays.copyOfRange(in,0,i); //左子树中序序列
int []rightpre=Arrays.copyOfRange(pre,i+1,pre.length); //右子树先序序列
int []rightin=Arrays.copyOfRange(in,i+1,in.length); //右子树先序序列
root.left=reConstructBinaryTree(leftpre,leftin);
root.right=reConstructBinaryTree(rightpre,rightin);
return root;
}
}