输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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 [] pre,int [] in) {
//pre中首位是根 根pre| 左子树 | 右子树
//in中根将数组分为左右子树,左右子树的根即为左孩子和右孩子 左子树 | 根in | 右子树
//根 pre --> 根 in --->左右子树的范围 -->根pre...
if(pre==null || in==null||pre.length==0||in.length==0)
return null;
TreeNode root = reBuildHelper(0, pre.length-1, 0, pre, in);
return root;
}
private TreeNode reBuildHelper(int begin, int end,int rootIndexInPre, int[] pre, int [] in){
//获取该区间的根,并将该区间分为两个部分,左区间的根为左孩子,右区间的根为右孩子
int curRootVal = pre[rootIndexInPre];
int rootIndexInIn = find(curRootVal,in);
TreeNode curRootNode = new TreeNode(curRootVal);
//note:已知当前根节点在pre中的位置rootIndexInPre,加上左右子树的大小,即可知道左右子树根节点在pre中的位置。
//分别为rootIndexInPre+1 和rootIndexInPre+左子树大小+1
//如果存在右子树,求右孩子
if(rootIndexInIn<end)
curRootNode.right = reBuildHelper(rootIndexInIn+1,end,rootIndexInPre+(rootIndexInIn-begin)+1,pre,in);
//如果存在左子树,求左孩子
if(rootIndexInIn>begin)
curRootNode.left = reBuildHelper(begin,rootIndexInIn-1,rootIndexInPre+1 ,pre,in);
return curRootNode;
}
private Integer find(int curRootVal, int[] in){
for(int i=0;i<in.length;i++){
if(in[i]==curRootVal)
return i;
}
return -1;
}
}