题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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); }
}