38.序列化二叉树

请实现两个函数,分别用来序列化和反序列化二叉树。

您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。

数据范围:

树中节点数量 [0,1000]。

样例:

你可以序列化如下的二叉树
image
为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"

注意:

  • 以上的格式是AcWing序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。

代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {

    //序列化二叉树(前序遍历方式)
    // Encodes a tree to a single string.
    String serialize(TreeNode root) {
        //如果当前节点为空,返回"null,"表示空节点
        if(root == null)return "null,";
        //前序遍历:先处理当前节点,然后左子树,最后右子树
        String s = root.val+",";
        //递归序列化左子树
        s += serialize(root.left);
        //递归序列化右子树
        s += serialize(root.right);
        //返回序列化结果
        return s;
    }

    //反序列化字符串为二叉树
    // Decodes your encoded data to tree.
    TreeNode deserialize(String data) {
        //将序列化字符串按逗号分割成数组
        String[] s = data.split(",");
        //使用队列存储节点值
        Queue<String>queue = new LinkedList<>();
        //将分割后的字符串数组存入队列
        for(String s1:s)queue.add(s1);
        //调用辅助方法构建二叉树
        return buildTree(queue);
    }
    
    // 辅助方法:根据队列构建二叉树
    private TreeNode buildTree(Queue<String> queue) {
        //取出队列第一个元素
        String s = queue.poll();
        //如果是"null",表示空节点
        if(s.equals("null"))return null;
        //创建当前节点(将字符串转换为整数)
        TreeNode root = new TreeNode(Integer.parseInt(s));
        //递归构建左子树
        root.left = buildTree(queue);
        //递归构建右子树
        root.right = buildTree(queue);
        //返回当前构建好的节点
        return root;
    }
}
posted @ 2025-05-27 11:16  回忆、少年  阅读(12)  评论(0)    收藏  举报