leetcode 297. serialize-and-deserialize-binary-tree 二叉树的序列化与反序列化 python3

本文探讨了二叉树的序列化与反序列化算法,介绍了通过层序遍历、前序遍历及后序遍历实现序列化和反序列化的两种方法。并提供了详细的代码实现,帮助理解如何将二叉树结构转化为字符串,以及如何从字符串重构二叉树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间:2020-8-24

题目地址:

https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/

题目难度:

Hard

题目描述:

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

示例: 

你可以将以下二叉树:

    1
   / \
  2   3
     / \
    4   5

序列化为 "[1,2,3,null,null,4,5]"
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。


思路1:层序遍历

代码段1:通过

# Definition for a binary tree node.
# 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
        """
        if not root:return "[]"
        queue = collections.deque()
        queue.append(root)
        res = []
        
        while queue:
            cur = queue.popleft()
            if cur:
                res.append(str(cur.val))
                queue.append(cur.left)
                queue.append(cur.right)
            else:
                res.append("null")
        print('[' + ','.join(res) + ']')
        return '[' + ','.join(res) + ']'


    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        if data == '[]': return None
        value, i = data[1: -1].split(','), 1
        root = TreeNode(value[0])
        queue = collections.deque()
        queue.append(root)
        while queue:
            cur = queue.popleft()
            if value[i] != 'null':
                cur.left = TreeNode(int(value[i]))
                queue.append(cur.left)
            i += 1
            if value[i] != 'null':
                cur.right = TreeNode(int(value[i]))
                queue.append(cur.right)
            i += 1
        return root
            
            

        

# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))

总结:

  1. 层序遍历,都写不出来了(๑ŐдŐ)b


2021-2-3 and 2021-2-4

思路2:前序遍历 or 中序遍历 

本来通过一种遍历无法进行序列化和反序列化的,但是这里的二叉树是带空结点的,且前序、后序确定根结点的位置,所以,前序、后序可以,中序不可以。

代码段2:通过

# Definition for a binary tree node.
# 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
        """
        res = []
        def traverse(root):
            nonlocal res
            if root == None:
                res.append('#') # 为空时用‘#’替代
                return None
            res.append(str(root.val))
            traverse(root.left)
            traverse(root.right)
        traverse(root)
        result = ','.join(res) # 节点之间以','分割
        return result 

    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        nodes = data.split(',')
        def des(nodes):
            if len(nodes) == 0:
                return None
            temp = nodes[0]
            del nodes[0]
            if temp == '#':
                return None
            root = TreeNode(int(temp)) # 第一个结点是根结点,剩下的交给递归去处理即可
            root.left = des(nodes)
            root.right = des(nodes)
            return root
        return des(nodes)
        


        

# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))
# Definition for a binary tree node.
# 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
        """
        res = []
        def traverse(root):
            nonlocal res
            if root == None:
                res.append('#') # 为空时用‘#’替代
                return None
            traverse(root.left)
            traverse(root.right)
            res.append(str(root.val))
        traverse(root)
        result = ','.join(res) # 节点之间以','分割
        return result 

    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        nodes = data.split(',')
        def des(nodes):
            if len(nodes) == 0:
                return None
            temp = nodes[-1]
            del nodes[-1]
            if temp == '#':
                return None
            root = TreeNode(int(temp)) # 第一个结点是根结点,剩下的交给递归去处理即可 
            root.right = des(nodes)
            root.left = des(nodes)
            return root
        return des(nodes)
        
        

# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))

总结:

  1. 上面两种解法不一样的是,序列化的顺序不一样,一个前序,一个后序,反序列化从最后一位开始,先右后左

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值