1 package com.S;
2
3 import java.util.Arrays;
4
5 public class Tree {
6
7 int data;
8 Tree left;
9 Tree right;
10
11 public Tree(int data){
12 this.data = data;
13 }
14 public Tree(int data, Tree left, Tree right){
15 this.data = data;
16 this.left = left;
17 this.right = right;
18 }
19
20 public void afterShow(){
21 //左
22 if(left != null){
23 left.afterShow();
24 }
25 //右
26 if(right != null){
27 right.afterShow();
28 }
29 //自己
30 System.out.println(data);
31 }
32
33 /**
34 * 重建树
35 * @param preOrders 树的前序
36 * @param inOrders 树的中序
37 * @return
38 */
39 public Tree buildTree(int[] preOrders, int[] inOrders){
40 //递归截止条件,有一个为空,就说明没有子节点了
41 if(preOrders.length == 0 || inOrders.length == 0){
42 return null;
43 }
44 //每轮的根节点就是preOrders的第一个
45 Tree root = new Tree(preOrders[0]);
46 //根据inOrders查找到根节点的下标,返回index
47 int index = search(inOrders, root.data);
48 if(index >= 0){
49 //Arrays.copyOfRange(preOrders, 1, index+1),截取preOrders,从1到index+1,前包后不包
50 root.left = buildTree(Arrays.copyOfRange(preOrders, 1, index+1), Arrays.copyOfRange(inOrders, 0, index));
51 root.right = buildTree(Arrays.copyOfRange(preOrders, index+1, preOrders.length), Arrays.copyOfRange(inOrders, index+1, inOrders.length));
52 }
53 return root;
54 }
55
56 /**
57 * 根据inOrders查找根节点的下标,目的是找到左子树和右子树的分界
58 * @param inOrders 中序
59 * @param data 根节点
60 * @return
61 */
62 public int search(int[] inOrders, int data){
63 for (int i = 0; i < inOrders.length; i++) {
64 if(data == inOrders[i]){
65 return i;
66 }
67 }
68 return -1;
69 }
70
71
72 public static void main(String[] args) {
73 int[] preOrders = {1,2,4,5,3,6,7};
74 int[] inOrders = {4,2,5,1,6,3,7};
75 new Tree(preOrders[0]).buildTree(preOrders, inOrders).afterShow();
76 }
77
78 }