• 【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));

    总结

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

  • 相关阅读:
    [附源码]Python计算机毕业设计Django农产品销售网站
    强迫症福音!一个小技巧,让DALLE-3创作排列美学
    jvm简介
    四旋翼无人机学习第8节--OpenMV电路分析
    MySQL 中 DATETIME 和 TIMESTAMP 时间类型的区别及使用场景
    实时配送跟踪功能的实现:外卖跑腿小程序的技术挑战
    [JavaScript]函数进阶,解构赋值,js垃圾回收机制,闭包,变量提升,函数提升
    element-ui+vue上传图片和评论现成完整html页面
    Python 共享内存与 Qt c++ 程序进程之间通信
    数据结构与算法介绍与学习路线
  • 原文地址:https://blog.csdn.net/qq_57438473/article/details/132736257