剑指offer 序列化二叉树

本文介绍了如何序列化和反序列化二叉树。通过递归方法实现,序列化时采用前序遍历,将节点值拼接成字符串,并用特殊符号编码空节点;反序列化时同样按照前序遍历解析字符串,创建二叉树结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

在这里插入图片描述

分析

题目并不复杂,关键是理解它并建立思路。序列化和反序列化无非是把对象转化为字符串形式存储和把字符串还原为对象这两个过程。看到序列化会想到遍历,二叉树;目标是字符串,那么就可以使用字符串拼接的方式。那么是否可以采用递归呢?可以的,在序列化的过程中,子节点和父节点具有相同的规律。在实现上,序列化时采用递归,对子树递归并把子树返回的字符串拼接在当前字符串后,最终返回总的字符串;反序列化时需要采用相同的规律,如果序列化是采用前序遍历,那么反序列化也应该采用前序遍历,反序列化需要设立一个指针,它的移动引领着字符串上节点数据的读取。另外在序列化和反序列化中,不要忘记对空字符串进行编码,可以采用“$,”符号,普通节点就用“val”+“,”。
序列化:

String Serialize(TreeNode root) {
        StringBuilder build = new StringBuilder();
        if(root == null) {
            build.append("$,");
        }else {
            build.append(root.val + ",");
            build.append(Serialize(root.left));
            build.append(Serialize(root.right));
        }
        return build.toString();
    }

反序列化中的指针移动:

      while(str.charAt(index) != ','){
          index ++;
      }

反序列化读取val值:

int val = Integer.parseInt(str.substring(start, index));

反序列化先index++再递归:

     int val = Integer.parseInt(str.substring(start, index));
     node = new TreeNode(val);
     index ++;
     node.left = Deserialize(str);
     node.right = Deserialize(str);

代码

public class Solution {
    String Serialize(TreeNode root) {
        StringBuilder build = new StringBuilder();
        if(root == null) {
            build.append("$,");
        }else {
            build.append(root.val + ",");
            build.append(Serialize(root.left));
            build.append(Serialize(root.right));
        }
        return build.toString();
    }
    int index = 0;
    TreeNode Deserialize(String str) {
        if(str.length() == 0 || index == str.length()){
            return null;
        }
        TreeNode node = null;
        int start = index;
        while(str.charAt(index) != ','){
            index ++;
        }
        if(!str.substring(start, index).equals("$")){
            int val = Integer.parseInt(str.substring(start, index));
            node = new TreeNode(val);
            index ++;
            node.left = Deserialize(str);
            node.right = Deserialize(str);
        }else {
            index ++;
        }
            return node;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值