本文最后更新于:2020年12月25日 下午
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树: 1 / \ 2 3 / \ 4 5 序列化为 "[1,2,3,null,null,4,5]"
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式 。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。
Solution
参考:《算法小抄》3.5、@tinylife
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 class Codec : def serialize (self, root ): """Encodes a tree to a single string. :type root: TreeNode :rtype: str """ if not root: return "[]" res = [] def preOrder (root ): if not root: res.append("null" ) return res.append(str (root.val)) preOrder(root.left) preOrder(root.right) preOrder(root) return '[' +',' .join(res)+']' def deserialize (self, data ): """Decodes your encoded data to tree. :type data: str :rtype: TreeNode """ if data=='[]' : return res = iter (data[1 :-1 ].split(',' )) def preOrder (): val = next (res) if val =="null" : return node = TreeNode(int (val)) node.left = preOrder() node.right = preOrder() return node return preOrder()
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 class Codec : def serialize (self, root ): if not root: return "[]" res = [] def postOrder (root ): if not root: res.append("null" ) return postOrder(root.left) postOrder(root.right) res.append(str (root.val)) postOrder(root) return '[' +',' .join(res)+']' def deserialize (self, data ): if data=='[]' : return res = data[1 :-1 ].split(',' ) def postOrder (): val = res.pop() if val =="null" : return node = TreeNode(int (val)) node.right = postOrder() node.left = postOrder() return node return postOrder()
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 class Codec : def serialize (self, root ): if not root: return "[]" res = [] queue = deque() queue.append(root) while queue: node = queue.popleft() if node: res.append(str (node.val)) queue.append(node.left) queue.append(node.right) else : res.append("null" ) return '[' +',' .join(res)+']' def deserialize (self, data ): if data=='[]' : return res = data[1 :-1 ].split(',' ) i = 1 root = TreeNode(int (res[0 ])) queue = deque() queue.append(root) while queue: node = queue.popleft() left = res[i] if left != "null" : node.left = TreeNode(int (left)) queue.append(node.left) else : node.left = None i+=1 right = res[i] if right != "null" : node.right = TreeNode(int (right)) queue.append(node.right) else : node.right = None i+=1 return root