-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCreateTree06.java
More file actions
145 lines (130 loc) · 5.09 KB
/
CreateTree06.java
File metadata and controls
145 lines (130 loc) · 5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package offer;
import java.util.Arrays;
/*
* 根据前序遍历和中序遍历构建二叉树
*
* 根据中序遍历和后序遍历构建二叉树
*/
public class CreateTree06 {
//递归方法1
public TreeNode23 reConstructBinaryTree(int[] pre, int[] in) {
// ����
if (((pre.length == 0 || in.length == 0)) || pre.length != in.length) {
return null;
}
int i = 0, j = 0;
TreeNode23 node = new TreeNode23(pre[i]);
while(in[j] != node.data){
j++;
}
int[] left_pre = new int[j];
int[] left_in = new int[j];
int[] right_pre = new int[pre.length - j -1];
int[] right_in = new int[in.length - j - 1];
for(i = 0; i < in.length ; i++){
if(i < j){
left_in[i] = in[i];
left_pre[i] = pre[i + 1];
}else if(i > j){
//����J ֮�� �������������˵��ͬ��
//ǰ���Ѿ���j+1��Ԫ���ˣ���ʱ��i = j + 1�����ұߵ�������±�Ӧ��i - (j + 1)��ʼ����0��ʼ
right_in[i - (j + 1)]= in[i];
right_pre[i - (j + 1)] = pre[i];
}
}
node.left = reConstructBinaryTree(left_pre, left_in);
node.right = reConstructBinaryTree(right_pre, right_in);
return node;
}
//中序遍历树
public static void midTraverse(TreeNode23 node) {
if (node != null) {
if (node.left != null) {
midTraverse(node.left);
}
System.out.print(node.data + " ");
if (node.right != null) {
midTraverse(node.right);
}
}
}
//后序遍历
static void PostOrder(TreeNode23 T){
if(T != null){
//访问左子结点
PostOrder(T.left);
//访问右子结点
PostOrder(T.right);
//访问根节点
System.out.print(T.data + " ");
}
}
//递归版本2
public TreeNode23 reConstructBinaryTree2(int[] pre, int[] in){
TreeNode23 root = create(pre, 0, pre.length - 1, in, 0, in.length - 1);
return root;
}
public TreeNode23 create(int[]pre, int pre_start, int pre_end, int []in,
int in_start, int in_end){
if(pre_start > pre_end || in_start > in_end){
return null;
}
TreeNode23 root = new TreeNode23(pre[pre_start]);
//在中序中找到根节点将数据分为两半
for (int i = 0; i < in.length; i++) {
if(in[i] == pre[pre_start]){
root.left = create(pre, pre_start + 1, pre_start + i - in_start,
in, in_start, i - 1);
//i - in_start == 左子树元素个数
root.right = create(pre, pre_start + i - in_start + 1, pre_end,
in, i + 1, in_end);
}
}
return root;
}
/**
* 递归版本3 根据中序和后序建立二叉树
* @param pre
* @param post
* @return
*/
public TreeNode23 reConstructBinaryTree3(int[] post, int[] in){
TreeNode23 root = create3(post, 0, post.length - 1, in, 0, in.length - 1);
return root;
}
public TreeNode23 create3(int[]post, int post_start, int post_end, int []in,
int in_start, int in_end){
if(post_start > post_end || in_start > in_end){
return null;
}
TreeNode23 root = new TreeNode23(post[post_end]);
//在中序中找到根节点将数据分为两半
for (int i = 0; i < in.length; i++) {
if(in[i] == post[post_end]){
//后序序列中:左子树范围[post_start,post_start + i - in_start - 1]
//中序序列中:左子树范围[in_start, i - 1]
root.left = create3(post, post_start, post_start + i - 1 - in_start,
in, in_start, i - 1);
//i - in_start == 左子树元素个数
//后序序列中:右子树范围[post_start,post_start + i - in_start]
//中序序列中:右子树[i + 1, in_end]
root.right = create3(post, post_start + i - in_start, post_end - 1,
in, i + 1, in_end);
}
}
return root;
}
public static void main(String[] args) {
int[] pre = { 1, 2, 4, 7, 3, 5, 6, 8 };
int[] in = { 4, 7, 2, 1, 5, 3, 8, 6 };
// int[] a = Arrays.copyOfRange(pre, 0 + 1, 4);
// System.out.println(Arrays.toString(a));
System.out.println("\n前序和中序建立二叉树");
TreeNode23 root = new CreateTree06().reConstructBinaryTree2(pre, in);
PostOrder(root);
System.out.println("\n中序和后序建立二叉树");
int [] post = { 7, 4 ,2, 5, 8, 6, 3, 1 };
TreeNode23 root_1 = new CreateTree06().reConstructBinaryTree3(post, in);
new TreeOperate23().preOrder(root_1);
}
}