题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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; }
* }
*/
import java.util.*;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0) return null;
int rt = pre[0];
int loc=0;
for(int i = 0; i < in.length; i++){
if(in[i] == rt){
loc = i;
break;
}
}
TreeNode tn = new TreeNode(rt);
tn.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,1+loc), Arrays.copyOfRange(in,0,loc));
tn.right = reConstructBinaryTree(Arrays.copyOfRange(pre,1+loc,pre.length),Arrays.copyOfRange(in,loc+1,in.length));
return tn;
}
}