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