剑指--序列化二叉树

    技术2025-09-08  40

    剑指–序列化二叉树

    1,题目:

    2,思路:

    序列化: 算法流程:

    1.特例处理: 若 root 为空,则直接返回空列表 “[]” ;2.初始化: 队列 queue (包含根节点 root );序列化列表 res ;3.层序遍历: 当 queue 为空时跳出;4.节点出队,记为 node ;5.若 node 不为空:① 打印字符串 node.val ,② 将左、右子节点加入 queue ;6.否则(若 node 为空):打印字符串 “null” ;7.返回值: 拼接列表(用 ‘,’ 隔开,首尾添加中括号)。

    下面是对应的图解:

    反序列化:

    算法流程:

    1.特例处理: 若 data 为空,直接返回 null ;2.初始化: 序列化列表 vals (先去掉首尾中括号,再用逗号隔开),指针 i=1 ,根节点 root (值为 vals[0] ),队列 queue(包含 root );3.按层构建: 当 queue 为空时跳出;4.节点出队,记为 node ;5.构建 node 的左子节点:node.left 的值为 vals[i] ,并将 node.left 入队;6.执行 i+=1 ;7.构建 node 的右子节点:node.left 的值为 vals[i] ,并将 node.left 入队;8.执行 i+=1 ;9.返回值: 返回根节点 root 即可。

    下面是对应的图解:

    3,代码:

    public class Codec { //序列化 public String serialize(TreeNode root) { /* 算法流程: 1.特例处理: 若 root 为空,则直接返回空列表 "[]" ; 2.初始化: 队列 queue (包含根节点 root );序列化列表 res ; 3.层序遍历: 当 queue 为空时跳出; 4.节点出队,记为 node ; 5.若 node 不为空:① 打印字符串 node.val ,② 将左、右子节点加入 queue ; 6.否则(若 node 为空):打印字符串 "null" ; 7.返回值: 拼接列表(用 ',' 隔开,首尾添加中括号)。 */ if(root == null) return "[]"; StringBuilder res = new StringBuilder("["); Queue<TreeNode> queue = new LinkedList<>() {{ add(root); }}; while(!queue.isEmpty()) { TreeNode node = queue.poll(); if(node != null) { res.append(node.val + ","); queue.add(node.left); queue.add(node.right); } else res.append("null,"); } res.deleteCharAt(res.length() - 1); res.append("]"); return res.toString(); } //反序列化 public TreeNode deserialize(String data) { /* 算法流程: 1.特例处理: 若 data 为空,直接返回 null ; 2.初始化: 序列化列表 vals (先去掉首尾中括号,再用逗号隔开),指针 i=1 ,根节点 root (值为 vals[0] ),队列 queue(包含 root ); 3.按层构建: 当 queue 为空时跳出; 4.节点出队,记为 node ; 5.构建 node 的左子节点:node.left 的值为 vals[i] ,并将 node.left 入队; 6.执行 i+=1 ; 7.构建 node 的右子节点:node.left 的值为 vals[i] ,并将 node.left 入队; 8.执行 i+=1 ; 9.返回值: 返回根节点 root 即可。 */ if(data.equals("[]")) return null;//若 data 为空,直接返回 null ; String[] vals = data.substring(1, data.length() - 1).split(",");//序列化列表 vals (先去掉首尾中括号,再用逗号隔开),指针 i=1 ,根节点 root (值为 vals[0] ),队列 queue(包含 root ); TreeNode root = new TreeNode(Integer.parseInt(vals[0])); Queue<TreeNode> queue = new LinkedList<>() {{ add(root); }}; int i = 1; while(!queue.isEmpty()) { TreeNode node = queue.poll(); if(!vals[i].equals("null")) { node.left = new TreeNode(Integer.parseInt(vals[i])); queue.add(node.left); } i++; if(!vals[i].equals("null")) { node.right = new TreeNode(Integer.parseInt(vals[i])); queue.add(node.right); } i++; } return root; } }
    Processed: 0.027, SQL: 9