题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] preTree,int [] inTree) {
return reConstructBinaryTreeCore(preTree,0,preTree.length-1,
inTree,0,inTree.length-1);
}
private TreeNode reConstructBinaryTreeCore(int[] preTree,int startPre,int endPre,
int[]inTree,int startIn,int endIn){
//1 从前序遍历得到根结点值
int rootVal=preTree[startPre];
TreeNode root=new TreeNode(rootVal);
root.left=null;
root.right=null;
//只有一个结点
if(startPre==endPre){
if(startIn==endIn && preTree[startPre]==inTree[startIn]){
return root;
}
}
//2 从中序遍历得到根结点位置(从而确定左右子树长度)
int rootIndexOfInTree=startIn;
while(rootIndexOfInTree<=endIn && inTree[rootIndexOfInTree]!=rootVal)
rootIndexOfInTree++;
if(rootIndexOfInTree==endIn && inTree[rootIndexOfInTree]!=rootVal)
return null;
//计算左子树长度
int lenOfLeftSubTree=rootIndexOfInTree-startIn;
//根据左子树的长度计算前序遍历结果中左子树的最后一个结点的下标
int lastIndexOfLeftSubTree=startPre+lenOfLeftSubTree;
//重建左子树
if(lenOfLeftSubTree>0)
root.left=reConstructBinaryTreeCore(preTree,startPre+1,lastIndexOfLeftSubTree,
inTree,startIn,rootIndexOfInTree-1);
//重建右子树
if(lenOfLeftSubTree<endPre-startPre )
root.right=reConstructBinaryTreeCore(preTree,lastIndexOfLeftSubTree+1,endPre,
inTree,rootIndexOfInTree+1,endIn);
return root;
}
}