forked from kexun/sort
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTreeSeri.java
101 lines (84 loc) · 1.91 KB
/
TreeSeri.java
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
package com.demo;
/**
* 二叉树的序列号 和 反序列化
* @author kexun
*
*/
public class TreeSeri {
public static void main(String[] args) {
Tree head = new Tree(1);
Tree h2 = new Tree(2);
Tree h3 = new Tree(3);
Tree h4 = new Tree(4);
Tree h5 = new Tree(5);
Tree h6 = new Tree(6);
Tree h7 = new Tree(7);
Tree h8 = new Tree(8);
Tree h9 = new Tree(9);
Tree h10 = new Tree(10);
head.left = h2;
head.right = h3;
h2.left = h4;
h2.right = h5;
h4.left = h6;
h5.right = h7;
h3.left = h8;
h3.right = h9;
h9.right = h10;
TreeSeri t = new TreeSeri();
// 序列化
String res = t.serialize(head);
System.out.println(res);
// 反序列化
Tree tree = t.deserialize(res);
res = t.serialize(tree);
System.out.println(res);
}
/**
* 序列化,将二叉树以先序的方式转成字符串。每个元素结束都以!结尾,如果是空表示#!
* @param head
* @return
*/
public String serialize(Tree head) {
String res = "";
if (head == null) {
return "#!";
}
res = head.data+"!";
String sl = serialize(head.left);
res += sl;
String sr = serialize(head.right);
res += sr;
return res;
}
/**
* 反序列化, 将字符串还原成二叉树。
* @param str
* @return
*/
public Tree deserialize(String str) {
String[] array = str.split("!");
if (array.length == 0) {
return null;
}
Tree head = revert(array);
return head;
}
//这个遍历i是为了控制数组的遍历,在递归的时候,依然能逐个依次获取到数组中的每个元素。
public int i = 0;
public Tree revert(String[] array) {
String data = array[i];
if ("#".equals(data) || i >= array.length) {
return null;
} else {
i++;
Tree left = revert(array);
i++;
Tree right = revert(array);
Tree tree = new Tree(Integer.valueOf(data));
tree.left = left;
tree.right = right;
return tree;
}
}
}