You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode297二叉树序列化与反序列化适配代码运行错误排查

代码错误排查及修正方案

你的代码存在3个核心逻辑错误,对应问题及解决方案如下:

  • 错误1:忽略Java String不可变特性,反序列化的字符串偏移不生效
    Java中的String是不可变对象,你在deserialize方法中执行data = data.substring(1)仅修改当前方法栈的局部变量,上层递归调用拿到的还是未切割的原字符串,每次都重复读取第一个字符,逻辑完全失效。而你参考的代码使用的是可变的ArrayList对象,remove操作会修改全局的列表内容,因此可以正常推进指针。
  • 错误2:无值分隔符,无法处理多位数/负数节点值
    当前序列化逻辑直接拼接节点值,没有添加分隔符:比如节点值为12和3时,序列化结果为123,反序列化时无法区分是单个节点123、还是[12,3]、还是[1,23]。同时你直接取Character.getNumericValue(data.charAt(0))的写法只能处理单个正整数值,而LeetCode本题节点值范围是-1000~1000,必然会解析错误。
  • 错误3:StringBuilder为实例变量,多次调用序列化会有残留
    你把StringBuilder定义为Codec类的成员变量,如果同一个Codec实例多次调用serialize方法,上一次的序列化结果会残留在StringBuilder中,导致输出结果异常。

修正后代码

public class Codec {
    // 序列化时使用逗号作为分隔符,空节点用^标记
    public String serialize(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        serializeHelper(root, sb);
        return sb.toString();
    }

    private void serializeHelper(TreeNode root, StringBuilder sb) {
        if (root == null) {
            sb.append("^,");
            return;
        }
        sb.append(root.val).append(",");
        serializeHelper(root.left, sb);
        serializeHelper(root.right, sb);
    }

    // 反序列化用队列维护待解析的节点值,解决String不可变问题
    public TreeNode deserialize(String data) {
        Queue<String> queue = new LinkedList<>(Arrays.asList(data.split(",")));
        return deserializeHelper(queue);
    }

    private TreeNode deserializeHelper(Queue<String> queue) {
        String val = queue.poll();
        if (val.equals("^")) {
            return null;
        }
        TreeNode node = new TreeNode(Integer.parseInt(val));
        node.left = deserializeHelper(queue);
        node.right = deserializeHelper(queue);
        return node;
    }
}

内容的提问来源于stack exchange,提问作者jerry22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:54:01