297. 二叉树的序列化与反序列化(Python)

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

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

示例:

你可以将以下二叉树:

    1
   / \
  2   3
     / \
    4   5

序列化为 “[1,2,3,null,null,4,5]”

想法:使用栈和广度优先算法遍历树来实现序列化和反序列化
1.序列化:层序遍历(广度优先),依次遍历栈中所有根节点保存左右子树值,如遇左右子树非空时需要保存根节点用于后续访问,如遇空值则跳过
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
        """
        # 树为空,直接返回
        if root == None:
            return []

        # 保存当前根节点
        stack = [root]
        # 保存序列
        series = [root.val]

        while stack:
            tree = stack.pop(0)

            # 如果当前左节点不为空
            if tree.left != None:
                # 序列中添加该值
                series.append(tree.left.val)
                # 栈中保存这个非空根节点
                stack.append(tree.left)
            else:
                # 序列中添加None
                series.append(None)
            
            # 如果当前右节点不为空,处理同左节点
            if tree.right != None:
                series.append(tree.right.val)
                stack.append(tree.right)
            else:
                series.append(None)

        return series
            

    def deserialize(self, data):
        """Decodes your encoded data to tree.

        :type data: str
        :rtype: TreeNode
        """
        # 序列为空,直接返回
        if data == []:
            return None

        # 保存树
        deseries = TreeNode(data.pop(0))
        # 保存当前所有非空根节点
        stack = [deseries]

        while stack:
            root = stack.pop(0)

            # 如果根节点为空,跳过
            if root.val == None:
                continue

            # 弹出左节点值,如果为空跳过
            value = data.pop(0)
            if value != None:
                # 生成左子树
                left = TreeNode(value)
                # 连接子树
                root.left = left
                # 保存左子树根节点用于后续访问
                stack.append(left)

            # 处理右节点同左节点处
            value = data.pop(0)
            if value != None:
                right = TreeNode(value)
                root.right = right
                stack.append(right)

        return deseries

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

参考链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值