297. 二叉树的序列化与反序列化

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构

序列化,返序列化
按先序排序序列化

public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root==null){
            return "#_";
        }
        String res=root.val+"_";
        res+=serialize(root.left);
        res+=serialize(root.right);
        return res;
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        String[] strs=data.split("_");
        Queue<String> queue=new LinkedList<>();
        for(String str:strs){
            queue.add(str);
        }
        return reconPreOrder(queue);
        
    }
    public TreeNode reconPreOrder(Queue<String> queue){
        String str=queue.poll();
        //这里要用equals,不能用==
        if(str.equals("#")){
            return null;
        }
        TreeNode head=new TreeNode(Integer.valueOf(str));
        head.left=reconPreOrder(queue);
        head.right=reconPreOrder(queue);
        return head;
    }
}

  

048. 序列化与反序列化二叉树

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

 

示例 1:

 

 

 

输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]

// Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        // # _
        if(root==null){
            return "#_";
        }
        String res=root.val+"_";
        res+=serialize(root.left);
        res+=serialize(root.right);
   
        return res;
        
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data==null){
            return null;
        }
        if(data.length()==1 && !data.equals("#")){
            return new TreeNode(Integer.valueOf(data));
        }
        if(data.length()==1 && data.equals("#")){
            return null;
        }
        // System.out.println(data);
       String[] strs=data.split("_");
        LinkedList<String> queue=new LinkedList<>();
        for(String s:strs){
          //   System.out.println(s);
            queue.add(s);
        }
        return reconPreOrder(queue);

        
    }

    private TreeNode reconPreOrder(LinkedList<String> queue){
        String str=queue.poll();
        //System.out.println
        if(str.equals("#")){
            return null;
        }
        TreeNode head=new TreeNode(Integer.valueOf(str));
        head.left=reconPreOrder(queue);//queue. queue.poll()
        head.right=reconPreOrder(queue);
        return head;

    }

  

 

posted @ 2021-09-02 18:28  sherry001  阅读(35)  评论(0编辑  收藏  举报