Leetcode 297. 二叉树的序列化与反序列化

1.题目基本信息

1.1.题目描述

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

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

提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

1.2.题目地址

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

2.解题方法

2.1.解题思路

使用栈求二叉树的前序遍历字符串+DFS反序列化构建二叉树

2.2.解题步骤

序列化:

  • 使用栈获取二叉树的前序遍历的字符串序列(注意:需要加上None节点),加None的原因是在反序列化时提供终止递归终止条件

反序列化:

  • 第一步,将各个节点的值解析到数组中(包括None节点)
  • 第二步,使用DFS将从数组中取出节点,创建节点,并继续DFS获取左右节点的值,并创建子节点放到当前节点的左右位置

3.解题代码

Python代码

# 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
        """
        # 使用栈获取二叉树的前序遍历的字符串序列(注意:需要加上None节点),加None的原因是在反序列化时提供终止递归终止条件
        text=""
        stack=[]
        node=root
        while node or stack:
            while node:
                text+=f"{node.val},"
                stack.append(node)
                node=node.left
            text+="None,"
            node=stack.pop()
            node=node.right
        text+="None,"
        # print(text)
        return text
    
    def deserialize(self, data):
        """Decodes your encoded data to tree.
        :type data: str
        :rtype: TreeNode
        """
        # 第一步,将各个节点的值解析到数组中(包括None节点)
        nodeStr=""
        nodeStrArr=[]
        for c in data:
            if c==",":
                nodeStrArr.append(nodeStr)
                nodeStr=""
            else:
                nodeStr+=c
        # 第二步,使用DFS将从数组中取出节点,创建节点,并继续DFS获取左右节点的值,并创建子节点放到当前节点的左右位置
        def dfs(arr):
            nodeStr=arr.pop(0)
            if nodeStr=="None":
                return None
            else:
                node=TreeNode(int(nodeStr))
                node.left=dfs(arr)
                node.right=dfs(arr)
                return node
        return dfs(nodeStrArr)

4.执行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GEEK零零七

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

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

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

打赏作者

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

抵扣说明:

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

余额充值