这里写自定义目录标题
重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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.Arrays;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
int rootVal = pre[0];//前序遍历第一个成员,即根结点。
if(pre.length == 0){//若前序遍历长度为0,则直接放回空。
return null;
}
if(pre.length == 1){//若前序遍历长度为0,则返回根结点。
return new TreeNode(rootVal);
}
//我们先找到root所在的位置,确定好前序和中序中左子树和右子树序列的范围
TreeNode root = new TreeNode(rootVal);//新建一个结点。
int rootIndex = 0;//新建一个结点索引。
for(int i=0;i<in.length;i++){//在中序数组中遍历,查找与前序数组根结点相同的成员。
if(rootVal == in[i]){//若第i个元素跟根结点数值相同
rootIndex = i;//则将根结点索引设为i。
break;
}
}
//递归,假设root的左右子树都已经构建完毕,那么只要将左右子树安到root左右即可
root.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,rootIndex+1),Arrays.copyOfRange(in,0,rootIndex));//将前序数组第二个元素到后面的i个成员和中序数组第一个元素到根结点索引的成员进行递归建树。
root.right = reConstructBinaryTree(Arrays.copyOfRange(pre,rootIndex+1,pre.length),Arrays.copyOfRange(in,rootIndex+1,in.length));//如上。
return root;
}
}