题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解答:
递归方法:
public class Q_4 {
public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
if (pre.length == 0) {
return null;
} else {
int val = pre[0];
TreeNode thisnode = new TreeNode(val);
int[] be = getBefore(in, val);
int besize = be.length;
if (besize > 0) {
int[] bepre = new int[besize];
for (int m = 0; m < besize; m++) {
bepre[m] = pre[m + 1];
}
TreeNode left = reConstructBinaryTree(bepre, be);//注意找出下一个递归的参数
thisnode.left = left;
}
int[] af = getAfter(in, val);
int afsize = af.length;
if (afsize > 0) {
int[] afpre = new int[afsize];
for (int m = 0; m < afsize; m++) {
afpre[m] = pre[m + besize+1];//复制右子树的数据,所以要去除左子树besize个数
}
TreeNode right = reConstructBinaryTree(afpre, af);
thisnode.right = right;
}
return thisnode;
}
}
//下面两个方法可以用Arrays.copyOfRange替代
public int[] getBefore(int[] arr, int val) {
ArrayList<Integer> arrayList = new ArrayList<>();
int i = 0;
while (arr[i] != val) {
arrayList.add(arr[i]);
i++;
}
int[] beforeArr = new int[arrayList.size()];
for (int j = 0; j < arrayList.size(); j++) {
beforeArr[j] = arrayList.get(j);
}
return beforeArr;
}
public int[] getAfter(int[] arr, int val) {
ArrayList<Integer> arrayList = new ArrayList<>();
boolean start=false;
for (int i = 0; i < arr.length; i++) {
if(start){
arrayList.add(arr[i]);
}
if(arr[i]==val) start=true;
}
int[] afterArr = new int[arrayList.size()];
for (int j = 0; j < arrayList.size(); j++) {
afterArr[j] = arrayList.get(j);
}
return afterArr;
}
public static void main(String[] args) {
int[] pre=new int[]{1,2,4,7,3,5,6,8};
int[] in=new int[]{4,7,2,1,5,3,8,6};
TreeNode node=new Q_4().reConstructBinaryTree(pre,in);
System.out.println(node);
}}

京公网安备 11010502036488号