码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【LeetCode】297.二叉树的序列化与反序列化


    题目

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

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

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

    示例 1:

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

    示例 2:

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

    示例 3:

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

    示例 4:

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

    提示:

    • 树中结点数在范围 [0, 10^4] 内
    • -1000 <= Node.val <= 1000

    解答

    源代码

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode(int x) { val = x; }
    8. * }
    9. */
    10. public class Codec {
    11. // Encodes a tree to a single string.
    12. public String serialize(TreeNode root) {
    13. return dfsSerialize(root, "");
    14. }
    15. // Decodes your encoded data to tree.
    16. public TreeNode deserialize(String data) {
    17. String[] dataArray = data.split(",");
    18. List dataList = new ArrayList<>(Arrays.asList(dataArray));
    19. return dfsDeserialize(dataList);
    20. }
    21. public String dfsSerialize(TreeNode root, String str) {
    22. if (root == null) {
    23. str += "none,";
    24. } else {
    25. str += root.val + ",";
    26. str = dfsSerialize(root.left, str);
    27. str = dfsSerialize(root.right, str);
    28. }
    29. return str;
    30. }
    31. public TreeNode dfsDeserialize(List dataList) {
    32. if (dataList.get(0).equals("none")) {
    33. dataList.remove(0);
    34. return null;
    35. }
    36. TreeNode root = new TreeNode(Integer.parseInt(dataList.get(0)));
    37. dataList.remove(0);
    38. root.left = dfsDeserialize(dataList);
    39. root.right = dfsDeserialize(dataList);
    40. return root;
    41. }
    42. }
    43. // Your Codec object will be instantiated and called as such:
    44. // Codec ser = new Codec();
    45. // Codec deser = new Codec();
    46. // TreeNode ans = deser.deserialize(ser.serialize(root));

    总结

    序列化也就是对原文件进行编码,反序列化即解码。而对二叉树的序列化和反序列化重点在于对二叉树的结构进行编码解码。我们可以根据深度优先遍历中的先序遍历对二叉树进行序列化,得到一个字符串,里面是先序遍历得到的节点的值用" , "分开,之后反序列化就是对这串字符串进行解码得到原来的二叉树。

  • 相关阅读:
    【C++入门】命名空间详解(从零开始,冲击蓝桥杯)
    0-1 背包问题
    Google codelab WebGPU入门教程源码<5> - 使用Storage类型对象给着色器传数据(源码)
    无线充,大功率小家电,智能家居,无人机快速充电等产品供电 LDR6328S芯片TYUPE-C PD诱骗电压 USB-C解决PD电源取电问题
    Angular 14 新的 inject 函数介绍
    AI 不仅仅埋葬了我的才华
    如何写好CRUD?
    【C++】构造函数调用规则 ( 默认构造函数 | 默认无参构造函数 | 默认拷贝构造函数 | 构造函数调用规则说明 )
    YOLO系列的Backbone改进历史
    公网使用PLSQL远程连接Oracle数据库【内网穿透】
  • 原文地址:https://blog.csdn.net/qq_57438473/article/details/132736257
  • 最新文章
  • 【FHE】我们如何实现同态加密推理(八):SiLU 的密文化——两条路径,和一个 8 字节的开关
    SQLcl 中 c/old/new 替换变量为何失效?先定位再替换
    不让模型写作文,直接从它脑子里读答案:Jev 决策在 .NET 的两条路线
    Halo插件:支持GitHub的图床附件策略
    电视投屏界的“一股清流”!SimpleTVCast 6.0.0-beta 抢先体验:无需TV端App,界面大换血!✨
    华三VXLAN集中式网关实战指南:Spine多活网关 + 双活接入(M-LAG)
    软件更好写之后口碑会更重要
    大 O、大 Omega、大 Theta 的区别,O(n) 复杂度是什么意思
    Java标签跳转:一个鲜为人知但却很实用的小技巧
    多智能体系统论文速读
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号