重建二叉树
/**
* 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
* 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
* 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
*/
思路:
/**
* 根据前序序列第一个结点确定根结点
* 根据根结点在中序序列中的位置分割出左右两个子序列
* 对左子树和右子树分别递归使用同样的方法继续分解
*/
解题:
//树的结点
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
//使用递归重建这棵树
//pre为前序遍历数组,in为中序遍历数组
public static TreeNode reConstructBinaryTree(int [] pre, int [] in) {
//递归出口是什么??当左子树为空,右子树为空时
if(pre.length==0 || in.length==0){
return null;
}
//把前序的第一个结点做为根结点
TreeNode root = new TreeNode(pre[0]);
//找到该根结点的结点
for(int i = 0; i<in.length;i++){
if(in[i]==pre[0]){
root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i));
root.right=reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
break;
}
}
return root;
}
说明:
Arrays.copyOfRange(target,i,j)
是截取目标数组,重第i个位到第j个位置
包括上指针i,不包括 下指针j
网友评论