• leetcode刷题笔记297题 二叉树的序列化与反序列化


    leetcode刷题笔记297题 二叉树的序列化与反序列化

    源地址:297. 二叉树的序列化与反序列化

    问题描述:

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

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

    示例:

    你可以将以下二叉树:

    1

    /
    2 3
    /
    4 5

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

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

    /**
     * Definition for a binary tree node.
     * class TreeNode(var _value: Int) {
     *   var value: Int = _value
     *   var left: TreeNode = null
     *   var right: TreeNode = null
     * }
     */
    
    class Codec {
        //使用ListBuffer 存储先序遍历结果
        val path = scala.collection.mutable.ListBuffer[String]()
        // Encodes a list of strings to a single string.
        def serialize(root: TreeNode): String = {
            dfs_s(root)
            //println(path.mkString)
            return path.mkString
        }
        
        def dfs_s(root: TreeNode): Unit = {
            if (root == null) path.append("#,")
            else {
                path.append((root.value).toString+",")
                dfs_s(root.left)
                dfs_s(root.right)
            }
        }
    
        // Decodes a single string to a list of strings.
        def deserialize(data: String): TreeNode = {
            //使用 U 标记位置
            var u = 0
            return dfs_d(data)
    
            def dfs_d(data: String): TreeNode = {
                if (data(u) == '#') {
                    u += 2
                    return null
                }
                else {
                    val k = u
                    while (data(u) != ',') u += 1
                    //println("u: " + u + ", k: " + k)
                    //println(data.substring(k, u))
                    val root = new TreeNode(data.substring(k, u).toInt)
                    u += 1
                    //println("u: " + u + ", data(u): " + data(u))
                    root.left = dfs_d(data)
                    root.right = dfs_d(data)
                    return root
                }
            }
            return dfs_d(data)
        }
    }
    
    /**
     * Your Codec object will be instantiated and called as such:
     * var ser = new Codec()
     * var deser = new Codec()
     * val s = ser.serialize(root)
     * val ans = deser.deserialize(s)
     */
    
  • 相关阅读:
    Linux查看程序端口占用情况
    详解大端模式和小端模式
    HDFS之二:HDFS文件系统JavaAPI接口
    HBase之四--(1):Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
    HBase之七:事务和并发控制机制原理
    HBase源码分析:HTable put过程
    QueryPerformanceFrequency使用方法--Windows高精度定时计数
    mongoDB的基本使用----飞天博客
    Android使用DOM生成和输出XML格式数据
    黑马程序猿_Java 代理机制学习总结
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/14008868.html
Copyright © 2020-2023  润新知