《二叉树序列化与反序列化:实现方法与细节解析》

前言

依赖:二叉树遍历算法细节与优化方案
本篇涉及谈谈二叉树的序列化问题。先序后序层序序列化以及反序列化的问题 中序序列化是不行的, 下面会给出解释

  1. 刷题网站:洛谷,leetcode, 牛客网。 网站链接自寻!
  2. 参考: 《程序员代码面试指南》 & 代码随想录。 每道题后我都会附带链接, 代码会上传到GitHub上
  3. 基础部分简略(任意教材都能找到的内容, 初学者都会的内容); 进阶部分有一定思考难度和coding挑战;拓展部分学得更加有深度。 上难度的平衡树有序表(treap, spaly, 红黑树这些)基本不会涉及。
  4. 编程语言: 笔者热爱Java, Java为主, 目前该模块并没有提供其它语言版本。 -借助chatgpt转换成自己的语言吧!
  5. IDE:Intellij IDEA。 主题: MonoKai pro ; 字体: Fira cod light。
  6. 容器和算法技巧: 栈, 队列, 哈希表, 数组; 递归, 分治, 对于部分可以使用动态规划的题也会提供解释。 读者应当可以用数组手搓栈和队列结构

提示

  • 题目通过000~999进行编号, 不过网站暂未提供目录结构无法快速寻找相关题目(不好意思)🥲。
  • 标题可以点击跳转页面。每道题都配有相关链接。 函数题一般是leetcode, acm风格是牛客和洛谷的。 处理输入输出的题的类里多数有main函数可以自行运行测试。
  • 每道题都可以ctrl + c, ctrl + v提交。注意:修改类名, 函数名, 不要提交无关的类。
  • 思考和coding, 而不是注重题量和速度哦。😘

013 先序遍历序列化和反序列化

内存中二叉树结构如何得以保存。 我们知道内存断电(没有任何服务会永远进行)会丢数据。
硬盘可以持久化地保存文件。 如何将二叉树保存在硬盘上呢?
文件是文本内容, 就是一堆字符串。
序列化本质是一种映射关系。只有将二叉树映射出一个字符串, 并且保证字符串能在内存中调用函数还原出这个二叉树, 就可以说是间接保存了这颗二叉树。
二叉树->字符串:称作二叉树的序列化。
字符串->二叉树:称作二叉树的反序列化。

013是根据先序遍历构建的。
序列化反序列化可以根据后序遍历和层序遍历构建对应的字符串。
中序遍历不行, 后面会举例说明。

如何唯一能保证字符串和二叉树结构对应唯一呢?

       A
      / \
     B   C
    / \   \
   D   E   F

先序序列化结果:
A,B,D,#,#,E,#,#,C,#,F,#,

用,作为节点分隔符;用#替代null(或空节点)。

代码:

//注意修改类名->Solution
//测试链接: https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/
public class Coding006_PreorderSerializeAndDeserialize {
   
    //不要提交这个类
     public static class TreeNode {
   
         int val;
         TreeNode left;
         TreeNode right;
         TreeNode(int x) {
    val = x; }
     }

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
   
         //创建一个可变字符串类StringBuilder类
         // 字符串高效增加元素。
         StringBuilder builder = new StringBuilder();
         //辅助调用
         f(root, builder);
         return builder.toString();//转String
    }
    //
    public void f(TreeNode root, StringBuilder builder){
   
         if(root == null){
   
             builder.append("#,");
         }
         else {
   
             //链式调用
             builder.append(root.val).append(",");
             f(root.left, builder);
             f(root.right, builder);
         }
    }
    //全局变量追踪当前字符
    public static int cnt = 0;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值