[leetcode297]Serialize and Deserialize Binary Tree

来源:互联网 发布:军事题材的网络电影 编辑:程序博客网 时间:2024/05/21 01:52

问题描述:

Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.

Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.

For example, you may serialize the following tree

    1   / \  2   3     / \    4   5
as "[1,2,3,null,null,4,5]", just the same as how LeetCode OJ serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.

Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.

Credits:
Special thanks to @Louis1992 for adding this problem and creating all test cases.

算法:

serialize算法很简单,利用广度优先逐层遍历节点,遇到None就进行下一次循环。遍历的同时,利用容器收集节点值的信息。最后用join方法拼接字符串。
具体而言,上图中的二叉树的遍历队列应该是:
[1]
[2,3]
[3,null,null]
[null,null,4,5]
[null,4,5]
[4,5]
[5,null,null]
[null,null,null,null]
[null,null,null]
[null,null]
[null]
[]
Deserialize算法也很简单。先用split将字符串转为节点列表。然后使用双指针,parent_idx指向当前父节点,sub_idx指向父节点的左子树。逐次迭代,每次parent_idx += 1,sub_idx += 2,遇到None,parent_idx自增,而sub_idx保持不变。

代码:

# Definition for a binary tree node.# class TreeNode(object):#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = Nonefrom collections import dequeclass Codec(object):    def serialize(self, root):        """Encodes a tree to a single string.                :type root: TreeNode        :rtype: str        """        container = []        que = deque([root])        while que:            cur = que.popleft()            if cur is None:                container.append('null')                continue            else:                container.append(str(cur.val))                que.append(cur.left)                que.append(cur.right)        return ",".join(container)            def deserialize(self, data):        """Decodes your encoded data to tree.                :type data: str        :rtype: TreeNode        """        if not data:            return None        container = [TreeNode(int(ele)) if ele != 'null' else None for ele in data.split(',')]        parent_idx = 0        sub_idx = 1        # root = None        while sub_idx+1 < len(container) and parent_idx < len(container):            parent = container[parent_idx]            if parent is None:                parent_idx += 1                continue            else:                parent.left = container[sub_idx]                parent.right = container[sub_idx+1]                parent_idx += 1                sub_idx += 2        return container[0]# Your Codec object will be instantiated and called as such:# codec = Codec()# codec.deserialize(codec.serialize(root))








0 0
原创粉丝点击