Top 100 Linked Question 修炼------第297题

297. Serialize and Deserialize Binary Tree

题目链接

题目解释:序列化是一个将数据结构或者对象转换为一个序列化的比特的过程,在进行这个操作之后,数据能够被存储到文件中或者内存缓冲区,或者通过网络连接链路传输,以便稍后在相同或另一个计算机环境中重建。

设计一个算法,去序列化和解序列化一个二叉树,关于你的算法是如何序列化/反序列化工作的没有限制,你仅仅需要保证的是一个二叉树能够被序列化为一个字符串(string),同时一个字符串(string)能够被反序列化为原始的树结构。

Example: 

You may serialize the following tree:

    1
   / \
  2   3
     / \
    4   5

as 
"[1,2,3,null,null,4,5]"

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

题目分析:在本题中,每个节点都给出了特定的表示,如2的两个子节点均是null,那么按照这样的方式,我们就可以采用先序遍历来记录下哪些位置是空节点的话,就是可以确定这棵树的。同时,序列化的时候我们要把把空节点记录下来。然后在反序列化时把它再变成空节点即可。

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Codec:
    def serialize(self, root):
        """Encodes a tree to a single string.采用先序遍历
        :type root: TreeNode
        :rtype: str
        """
        vals = []
        def preOrder(root):
            if not root:
                vals.append('#')
            else:
                vals.append(str(root.val))
                preOrder(root.left)
                preOrder(root.right)

        preOrder(root)
        return ' '.join(vals)

    def deserialize(self, data):
        """Decodes your encoded data to tree.
        :type data: str
        :rtype: TreeNode
        """
        vals = collections.deque(val for val in data.split())
        def build():
            if vals:
                val = vals.popleft()
                if val == '#':
                    return None
                root = TreeNode(int(val))
                root.left = build()
                root.right = build()
                return root
        return build()

总结

2019/6/1:儿童节快乐,希望每天都进步一点点,来,喝一瓶AD钙奶吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值