1
+ package com.leetcode.trees;
2
+
3
+
4
+ import java.util.LinkedList;
5
+ import java.util.Queue;
6
+
7
+ /**
8
+ * Level: Hard
9
+ * Link: https://leetcode.com/problems/serialize-and-deserialize-binary-tree/
10
+ * Description:
11
+ * Serialization is the process of converting a data structure or object into a sequence of bits so that it can be
12
+ * stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in
13
+ * the same or another computer environment.
14
+ *
15
+ * Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your
16
+ * serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized
17
+ * to a string and this string can be deserialized to the original tree structure.
18
+ *
19
+ * Example:
20
+ *
21
+ * You may serialize the following tree:
22
+ *
23
+ * 1
24
+ * / \
25
+ * 2 3
26
+ * / \
27
+ * 4 5
28
+ *
29
+ * as "[1,2,3,null,null,4,5]"
30
+ *
31
+ * Clarification: The above format is the same as how LeetCode serializes a binary tree. You do not necessarily need
32
+ * to follow this format, so please be creative and come up with different approaches yourself.
33
+ *
34
+ * Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms
35
+ * should be stateless.
36
+ *
37
+ * @author rampatra
38
+ * @since 2019-08-17
39
+ */
40
+ public class SerializeDeserializeBinaryTree {
41
+
42
+ /**
43
+ * Runtime: <a href="https://leetcode.com/submissions/detail/252443769/">31 ms</a>.
44
+ *
45
+ * @param root
46
+ * @return
47
+ */
48
+ public static String serialize(TreeNode root) {
49
+ if (root == null) {
50
+ return "[]";
51
+ }
52
+
53
+ StringBuilder sb = new StringBuilder();
54
+ sb.append("[");
55
+
56
+ Queue<TreeNode> queue = new LinkedList<>();
57
+ queue.add(root);
58
+
59
+ while (!queue.isEmpty()) {
60
+ TreeNode node = queue.poll();
61
+
62
+ if (sb.length() > 1) {
63
+ sb.append(", ");
64
+ }
65
+ if (node == null) {
66
+ sb.append("null");
67
+ continue;
68
+ }
69
+
70
+ sb.append(node.val);
71
+
72
+ queue.add(node.left);
73
+ queue.add(node.right);
74
+ }
75
+
76
+ sb.append("]");
77
+ return removeExtraNulls(sb.toString());
78
+ }
79
+
80
+ private static String removeExtraNulls(String data) {
81
+ int i = data.length() - 1;
82
+ while (!(data.charAt(i) >= 48 && data.charAt(i) <= 57)) {
83
+ i--;
84
+ }
85
+ return data.substring(0, i + 1) + "]";
86
+ }
87
+
88
+ /**
89
+ *
90
+ * @param data
91
+ * @return
92
+ */
93
+ public static TreeNode deserialize(String data) {
94
+ data = data.substring(1, data.length() - 1);
95
+
96
+ if (data.length() == 0) {
97
+ return null;
98
+ }
99
+
100
+ String[] values = data.split(", ");
101
+
102
+ TreeNode root = new TreeNode(Integer.parseInt(values[0]));
103
+
104
+ Queue<TreeNode> queue = new LinkedList<>();
105
+ queue.add(root);
106
+
107
+ for (int i = 0; i < values.length && !queue.isEmpty(); i += 2) {
108
+ TreeNode currNode = queue.poll();
109
+
110
+ if (i + 1 < values.length && !values[i + 1].equals("null")) {
111
+ TreeNode leftNode = new TreeNode(Integer.parseInt(values[i + 1]));
112
+ currNode.left = leftNode;
113
+ queue.add(leftNode);
114
+ }
115
+
116
+ if (i + 2 < values.length && !values[i + 2].equals("null")) {
117
+ TreeNode rightNode = new TreeNode(Integer.parseInt(values[i + 2]));
118
+ currNode.right = rightNode;
119
+ queue.add(rightNode);
120
+ }
121
+ }
122
+
123
+ return root;
124
+ }
125
+
126
+ public static void main(String[] args) {
127
+ // TODO Convert the print statements to asserts
128
+
129
+ System.out.println(serialize(new TreeNode(1)));
130
+
131
+ /*
132
+ Binary Tree
133
+
134
+ 1
135
+ / \
136
+ 2 3
137
+ / \
138
+ 4 5
139
+ */
140
+ TreeNode tree = new TreeNode(1);
141
+ tree.left = new TreeNode(2);
142
+ tree.right = new TreeNode(3);
143
+ tree.left.left = new TreeNode(4);
144
+ tree.left.right = new TreeNode(5);
145
+
146
+ System.out.println(serialize(tree));
147
+
148
+ System.out.println(serialize(deserialize(serialize(tree))));
149
+
150
+ System.out.println(serialize(deserialize(serialize(null))));
151
+
152
+ TreeNode tree2 = new TreeNode(1);
153
+ tree2.right = new TreeNode(2);
154
+ tree2.right.right = new TreeNode(3);
155
+ tree2.right.right.right = new TreeNode(4);
156
+ tree2.right.right.right.right = new TreeNode(5);
157
+ tree2.right.right.right.right.right = new TreeNode(6);
158
+ tree2.right.right.right.right.right.right = new TreeNode(7);
159
+ tree2.right.right.right.right.right.right.right = new TreeNode(8);
160
+
161
+ System.out.println(serialize(tree2));
162
+ System.out.println(serialize(deserialize(serialize(tree2))));
163
+
164
+ System.out.println("---");
165
+
166
+ System.out.println(serialize(deserialize("[1, 2]")));
167
+ System.out.println(serialize(deserialize("[1, 2, 3]")));
168
+ System.out.println(serialize(deserialize("[3, 2, 4, 1]")));
169
+ System.out.println(serialize(deserialize("[3, 2, 4, 1, 5, 6]")));
170
+ System.out.println(serialize(deserialize("[1, 2, 3, null, null, 4, 5]")));
171
+ System.out.println(serialize(deserialize("[5, 2, 3, null, null, 2, 4, 3, 1]")));
172
+
173
+ System.out.println(serialize(deserialize("[1, null, 2, null, 3, null, 4, null, 5]")));
174
+ System.out.println(serialize(deserialize("[1, null, 2, null, 3, null, 4, null, 5, null, 6]")));
175
+ System.out.println(serialize(deserialize("[1, null, 2, null, 3, null, 4, null, 5, null, 6, null, 7]")));
176
+ System.out.println(serialize(deserialize("[1, null, 2, null, 3, null, 4, null, 5, null, 6, null, 7, null, 8]")));
177
+ System.out.println(serialize(deserialize("[1, null, 2, null, 3, null, 4, null, 5, null, 6, null, 7, null, 8, null, 9]")));
178
+ }
179
+ }
0 commit comments