zoukankan      html  css  js  c++  java
  • 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)
     */
    
  • 相关阅读:
    使用 Eclipse PhoneGap 构建 Android 应用程序入门
    SSAS系列——【01】准备知识
    HDU 5763 Another Meaning 2016多校第四场1001 KMP+DP
    HDU 5794 A Simple Nim 2016多校第六场1003
    HDU 5758 Explorer Bo 2016多校第三场1007 树上DP
    HDU 5755 Gambler Bo 2016多校第三场1004
    HDU 5754 Life Winner Bo 2016多校第三场1003
    vue2.0引入腾讯地图
    MVC Razor模板引擎输出HTML或者生产HTML文件
    慎把“DataContext”静态化 或则单例
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/14008868.html
Copyright © 2011-2022 走看看