题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
1、分析
主要思路是递归实现:先构建根节点,然后在分别确定根节点的左子节点和右子节点。
2、代码
import java.util.Arrays;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
// 空判断
if(pre.length == 0){
return null;
}
//单值判断
if(pre.length == 1){
TreeNode root = new TreeNode(pre[0]);
root.left = null;
root.right = null;
return root;
}
//正常情况判断
//找根节点
int rootValue = pre[0];
//构建根节点
TreeNode root = new TreeNode(rootValue);
// 接下来递归左右子树
//在中序遍历序列中找树根,从而确定左右子树的中序遍历和前序遍历
int indexIn = 0;
for(int i = 0; i < in.length; i++){
if(in[i] == rootValue){
indexIn = i;
break;
}
}
//上面可知,中序遍历中的树根下标是i
//(0到i-1是左子树中序遍历,i+1到最后是右子树的中序遍历)
//构建左子树
root.left = reConstructBinaryTree(
Arrays.copyOfRange(pre,1,indexIn+1),
Arrays.copyOfRange(in,0,indexIn));
//构建右子树
root.right = reConstructBinaryTree(
Arrays.copyOfRange(pre,indexIn+1,pre.length),
Arrays.copyOfRange(in,indexIn+1,pre.length));
return root;
}
}
PS:
(1)Arrays.copyOfRange()方法
Arrays.copyOfRange(T[ ] original,int from,int to)
将一个原始的数组original,从下标from开始复制,复制到上标to,生成返回一个新的数组。
注意这里包括下标from,不包括上标to(左闭右开)