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
相关产品推荐
相关产品推荐

