1
+ from collections import deque
1
2
2
3
class TreeNode (object ):
3
4
def __init__ (self , x ):
@@ -12,40 +13,54 @@ class Codec:
12
13
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
13
14
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
14
15
"""
16
+ # 广度优先
15
17
def serialize (self , root ):
16
- """Encodes a tree to a single string.
18
+ queue = [root ]
19
+ res = []
17
20
18
- :type root: TreeNode
19
- :rtype: str
20
- """
21
- if not root :
22
- return 'null,'
23
-
24
- left = self .serialize (root .left )
25
- right = self .serialize (root .right )
26
- return str (root .val ) + ',' + left + right
21
+ while queue :
22
+ node = queue .pop (0 )
23
+ if node :
24
+ print (node .val )
25
+ res .append (str (node .val ))
26
+ queue .append (node .left )
27
+ queue .append (node .right )
28
+ else :
29
+ print ('null' )
30
+ res .append ('null' )
27
31
32
+ return ',' .join (res )
28
33
29
34
def deserialize (self , data ):
30
- """Decodes your encoded data to tree.
31
-
32
- :type data: str
33
- :rtype: TreeNode
34
- """
35
- l = data .split (',' )
36
- return self .build_tree (l )
37
-
38
- def build_tree (self , data ):
39
- if not data :
40
- return
41
- val = data .pop (0 )
42
- if val == 'null' : return None
43
- node = TreeNode (val )
44
- node .left = self .build_tree (data )
45
- node .right = self .build_tree (data )
46
- return node
35
+ if data == 'null' :
36
+ return None
47
37
48
- so = Codec ()
38
+ l = data .split ("," )
39
+ root = TreeNode (l [0 ])
40
+ queue = [root ]
41
+ cursor = 1
42
+
43
+ while cursor < len (l ):
44
+ node = queue .pop (0 )
45
+ left_val = l [cursor ]
46
+ right_val = l [cursor + 1 ]
47
+
48
+ if left_val != 'null' :
49
+ left_node = TreeNode (left_val )
50
+ node .left = left_node
51
+ queue .append (left_node )
52
+
53
+ if right_val != 'null' :
54
+ right_node = TreeNode (right_val )
55
+ node .right = right_node
56
+ queue .append (right_node )
49
57
50
- print (so .serialize (so .deserialize ('1,2,3,null,null,4,5' )))
58
+ cursor += 2
59
+
60
+ return root
61
+
62
+
63
+ so = Codec ()
64
+ print (so .serialize (so .deserialize ('1,2,3,null,null,4,5,null,null,null,null' )))
51
65
66
+ print ([1 , 2 , 3 ,].pop (0 ))
0 commit comments