zoukankan      html  css  js  c++  java
  • LeeCode 449. 序列化和反序列化二叉搜索树

    449. 序列化和反序列化二叉搜索树

    Difficulty: 中等

    序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。

    设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。

    编码的字符串应尽可能紧凑。

    示例 1:

    输入:root = [2,1,3]
    输出:[2,1,3]
    

    示例 2:

    输入:root = []
    输出:[]
    

    提示:

    • 树中节点数范围是 [0, 10<sup>4</sup>]
    • 0 <= Node.val <= 10<sup>4</sup>
    • 题目数据 保证 输入的树是一棵二叉搜索树。

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

    Solution

    既然给定了二叉搜索树,那就要充分利用二叉搜索树的性质:二叉搜索树中任意节点值大于其左子节点,小于其右子节点,通过先序遍历取出二叉搜索树中的所有结点,并将取出的结点转成字符串,完成序列化。

    对于反序列化,由序列化过程得到的结果(DLR),可以确定根节点D左右两边的结点,然后可以通过递归的方式完成反序列化。

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Codec:
    
        def serialize(self, root: TreeNode) -> str:
            """Encodes a tree to a single string.
            """
            if not root: 
                return ''
            stack, res = [root], []
            while stack:
                root = stack.pop()
                res.append(str(root.val))
                if root.right:
                    stack.append(root.right)
                if root.left:
                    stack.append(root.left)
            return ','.join(res)
            
    
        def deserialize(self, data: str) -> TreeNode:
            """Decodes your encoded data to tree.
            """
            if not data: 
                return None
            
            queue = []
            for e in data.split(','):
                if e != '':
                    queue.append(int(e))
            return self.helper(queue)
        
        def helper(self, queue):
            if not queue: 
                return None
            root = queue.pop(0)
            smallerQueue = []
            while queue and queue[0] < root:
                smallerQueue.append(queue.pop(0))
            
            root = TreeNode(root)
            root.left = self.helper(smallerQueue)
            root.right = self.helper(queue)
            return root
            
    
    # Your Codec object will be instantiated and called as such:
    # Your Codec object will be instantiated and called as such:
    # ser = Codec()
    # deser = Codec()
    # tree = ser.serialize(root)
    # ans = deser.deserialize(tree)
    # return ans
    
  • 相关阅读:
    MVC设置默认页面
    MySQL_DBA整理
    解决git提交敏感信息(回退git版本库到某一个commit)
    并发数计算
    高并发下的 Nginx 优化与负载均衡
    PassengerNginxdebian快速部署Rails
    Linux+postfix+extmail+dovecot打造基于web页面的邮件系统
    2018.11.30软件更新公告
    2018.10.11软件更新公告
    2018.09.25软件更新公告
  • 原文地址:https://www.cnblogs.com/swordspoet/p/14111672.html
Copyright © 2011-2022 走看看