美文网首页
LeetCode-297-二叉树的序列化与反序列化

LeetCode-297-二叉树的序列化与反序列化

作者: 阿凯被注册了 | 来源:发表于2020-11-20 08:29 被阅读0次

原题链接:

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。


image.png

解题思路:

  1. 序列化:层级遍历,用队列存储,每次从队列queue中取出第一个值,若存在node,将node.val存入结果列表ans中,并将其左右子树推入队列queue,若不存在,则将'null'写入ans中,最后输出ans的string格式。
  2. 反序列化:将读入的data取出首位的中括号并用逗号分隔,转换成list,用队列queue来存储节点,首先将list的首元素作为root存入queue,然后以左右子树交替遍历list,如果list[i]不为'null',则表示该元素可以作为节点的val,此时创建节点TreeNode(alist[i].val),可作为root的左右叶子节点,并将该node推入queue进行下一轮判断。

Python3代码:

# 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 = [root]
        ans = []
        while queue:
            size = len(queue)
            for i in range(size):
                node = queue.pop(0)
                if node:
                    ans.append(str(node.val))
                    queue.append(node.left)
                    queue.append(node.right)
                else:
                    ans.append('null')
        return '[' + ','.join(ans) + ']'
        

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







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

相关文章

  • 二叉树序列化和反序列化

    二叉树序列化和反序列化 前序 序列化和反序列化

  • 297. Serialize and Deserialize B

    二叉树序列化与反序列化 Runtime: 172 ms, faster than 42.05% Memory Us...

  • 二叉树的三种遍历方法

    二叉树的序列化 为了方便构造二叉树来验证我们的算法,这里先介绍下二叉树的序列化和反序列化。 序列化 先序遍历整颗二...

  • 二叉树的序列化 和反序列化

    对于二叉树的序列化与反序列化有n种方法,本文以先序和层序的方式序列化和反序列化 对于,以先序的方式序列化: 1、以...

  • 剑指offer刷题记录(C++版本)(之七)

    61.序列化二叉树??? 题目:请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按...

  • JZ-061-序列化二叉树

    序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树。二叉树的序列化是指:把一棵二叉树按照某种遍...

  • LeetCode:序列化二叉树

    面试题37. 序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。示例:你可以将以下二叉树: 序列化为 ...

  • 面试题37:序列化二叉树

    题目 实现两个函数,分别用来序列化和反序列化二叉树 解题思路 序列化根据前序遍历的顺序序列化二叉树,从根节点开始,...

  • 剑指Offer-61 二叉树序列化

    请实现两个函数,分别用来序列化和反序列化二叉树 利用广度遍历实现二叉树的序列化和非序列化。核心思想:广度遍历

  • LeetCode 297. 二叉树的序列化与反序列化 | Pyt

    297. 二叉树的序列化与反序列化 题目来源:力扣(LeetCode)https://leetcode-cn.co...

网友评论

      本文标题:LeetCode-297-二叉树的序列化与反序列化

      本文链接:https://www.haomeiwen.com/subject/kealiktx.html