前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LC297—二叉树的序列化与反序列化

LC297—二叉树的序列化与反序列化

作者头像
Java架构师必看
修改2023-09-25 14:56:33
2940
修改2023-09-25 14:56:33
举报
文章被收录于专栏:Java架构师必看

难度困难458

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

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

提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

广度优先遍历

代码语言:javascript
复制
package com.nie.OneJanLC;/* * *@auth wenzhao *@date 2021/1/14 0:09 */

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class LEE297 {
   

    class Codec {
   

        //把树的转化为字符串(使用BFS)
        public String serialize(TreeNode root) {
   
            if (root == null) {
   
                return "#";
            }
            //创建一个队
            Queue<TreeNode> queue = new LinkedList<>();
            StringBuilder res = new StringBuilder();
            //把根节点放入到队列中
            queue.add(root);
            while (!queue.isEmpty()) {
   
                int size = queue.size();
                for (int i = 0; i < size; i++) {
   
                    TreeNode node = queue.poll();
                    if (node == null) {
   
                        res.append("#,");
                        continue;
                    }
                    res.append(node.val + ",");
                    queue.add(node.left);
                    queue.add(node.right);
                }
            }
            return res.toString();
        }

        //把字符串还原为二叉树
        public TreeNode deserialize(String data) {
   
            //如果是"#" ,就表示为一个节点 返回null
            if (data == "#") {
   
                return null;
            }
            //创建一个队
            Queue<TreeNode> queue = new LinkedList<>();
            String[] values = data.split(",");
            //上面使用的是BFS 所以第一个值就是根节点得值,这里创建根节点
            TreeNode root = new TreeNode(Integer.parseInt(values[0]));
            queue.add(root);
            for (int i = 1; i < values.length; i++) {
   

                //队列中移出结点
                TreeNode parent = queue.poll();
                /* 因为在BFS中左右子结点是成对出现得 所以这里挨着的的两个值一个是做左子节点的值 一个是右子节点的值 当前值如果是"#" 就表示这个子节点为空 如果不是就不为空 */
                if (!"#".equals(values[i])) {
   
                    TreeNode left = new TreeNode(Integer.parseInt(values[i]));
                    parent.left = left;
                    queue.add(left);
                }
                if (!"#".equals(values[++i])) {
   
                    TreeNode right = new TreeNode(Integer.parseInt(values[i]));
                    parent.right = right;
                    queue.add(right);
                }
            }
            return root;
        }
    }

    public class TreeNode {
   
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
   
            val = x;
        }
    }
}

深度优先

代码语言:javascript
复制
package com.nie.OneJanLC;/*
 *
 *@auth  wenzhao
 *@date 2021/1/14  0:09
 */

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class LEE297L {

    class Codec {

        //把树的转化为字符串(使用DFS)
        public String serialize(TreeNode root) {
            if (root == null) {
                return "#";
            }
            return root.val + "," + serialize(root.left) + "," + serialize(root.right);
        }

        //把字符串还原为二叉树
        public TreeNode deserialize(String data) {
            Queue<String> queue = new LinkedList<String>(Arrays.asList(data.split("")));
            return  help(queue);
        }

        private TreeNode help(Queue<String> queue) {
            String val = queue.poll();
            if ("#".equals(val)){
                return  null;
            }
            //是否创建当前结点
            TreeNode root = new TreeNode(Integer.valueOf(val));
            root.left=help(queue);
            root.right=help(queue);
            return  root;
        }
    }

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }
}
Arrays.asList((data.split("")))
浅谈Arrays.asList()方法的使用

首先,该方法是将数组转化为list。有以下几点需要注意:

(1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean)

(2)该方法将数组与列表链接起来,当更新其中之一时,另一个自动更新

(3)不支持add和remove方法

data.split("")

通过正则分割

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 广度优先遍历
  • 深度优先
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档