剑指 Offer !37. 序列化二叉树

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

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

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

在这里插入图片描述
思路:使用先进先出的队列完成二叉树的按层遍历BFS。
在下面的序列化、反序列化函数中,为了保持一致性,规定:只有当结点不为null时,才允许进入队列queue。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
public class Codec {// Encodes a tree to a single string.public String serialize(TreeNode root) {ArrayList<String> ans = new ArrayList<>();Queue<TreeNode> queue = new LinkedList<>();if(root!=null){// 这样省去了“讨论root为null”的麻烦queue.offer(root);ans.add(String.valueOf(root.val));}while(!queue.isEmpty()){TreeNode cur = queue.poll();if(cur.left!=null){queue.offer(cur.left);ans.add(String.valueOf(cur.left.val));}else{ans.add("null");}if(cur.right!=null){queue.offer(cur.right);ans.add(String.valueOf(cur.right.val));}else{ans.add("null");}}int i=0,index=0;for(String s:ans){if(!s.equals("null")){index=i;}i++;}StringBuilder builder = new StringBuilder();builder.append("[");if(ans.size()==0){return builder.append("]").toString();}builder.append(ans.get(0));for(i=1;i<=index;i++){builder.append(","+ans.get(i));}builder.append("]");return builder.toString();}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {if(data.substring(1,data.length()-1)==""){return null;}String[] strs = data.substring(1,data.length()-1).split(",");        Queue<TreeNode> queue = new LinkedList<>();TreeNode root = new TreeNode(Integer.parseInt(strs[0]));queue.offer(root);int index=0;while(!queue.isEmpty()){TreeNode cur = queue.poll();if(index+1<strs.length&&!strs[++index].equals("null")){cur.left = new TreeNode(Integer.parseInt(strs[index]));queue.offer(cur.left);}if(index+1<strs.length&&!strs[++index].equals("null")){cur.right = new TreeNode(Integer.parseInt(strs[index]));queue.offer(cur.right);}}return root;}}// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/3869.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

删除PDF页面的10个操作工具方法分享

PDF被广泛用于各种目的&#xff0c;包括共享学术文件、专业报告&#xff0c;甚至个人文件。然而&#xff0c;有时您可能会发现需要从PDF中删除一些页面。虽然有很多付费软件可供选择&#xff0c;但也有很多免费删除PDF页面的方法。在这篇文章中&#xff0c;我们将讨论10种免费删…

C语言:猜名次

题目&#xff1a; 5位运动员参加了10米台跳水比赛&#xff0c;有人让他们预测比赛结果&#xff1a; A选手说&#xff1a;B第二&#xff0c;我第三&#xff1b; B选手说&#xff1a;我第二&#xff0c;E第四&#xff1b; C选手说&#xff1a;我第一&#xff0c;D第二&#xff1b…

基于Docker-compose实现的Postgresql-11的主从复制

参考文章&#xff1a; http://t.csdn.cn/EnOVn http://t.csdn.cn/XTJqZ 记录一次主从复制的配置经历 服务器主从角色分配 ipdb 版本角色192.168.33.23411主192.168.33.22511从 docker-compose.yml文件 version: "3.3" services:postgres:image: postgresql-gis:11…

Linux:LNMP上搭建discuz论坛(源码安装)

LNMP环境 Linux &#xff1a;LNMP&#xff08;源码包安装&#xff09;_鲍海超-GNUBHCkalitarro的博客-CSDN博客 discuz论坛 准备好源码包 LNMP环境正常 yum -y install unzip unzip Discuz_X3.3_SC_UTF8.zip # unzip 源码包名称 mv upload/ /usr/local/nginx/html/tarro…

云从科技大模型之路:昇思“黑土地”上的生态炼成记

文 | 智能相对论 作者 | 李永华 一线客户经理&#xff0c;为客户一键生成周全的资产配置建议&#xff1b; 中端管理人员&#xff0c;获得系统自动撰写的一整套数据分析报表&#xff0c;快速、准确授信&#xff1b; 金融市场的“操盘手”&#xff0c;能够实时获取那些影响市…

【框架源码】Spring源码解析之BeanDefinition加载流程解析

观看本文之前&#xff0c;我们先思考一个问题&#xff0c;Spring是如何描述Bean对象的&#xff1f; Spring是根据BeanDefinition来创建Bean对象&#xff0c;BeanDefinition就是Spring中表示Bean定义。BeanDefinition用来存储Bean的相关信息&#xff0c;主要包括&#xff1a;Be…

自动驾驶开源数据集(附下载链接)

自动驾驶是带动新兴产业的一个突破点&#xff0c;也是中国结合新能源汽车&#xff0c;实现汽车产业弯道超车的不二手段&#xff0c;是打破国外燃油车技术壁垒的关键一步&#xff01;它不会停止&#xff0c;只是在蓄势待发&#xff01; 数据集介绍&#xff1a;点击 自动驾驶场…

人机融合是自由与决定的交互

人机融合是指人类与机器之间的紧密合作与互动。在这种融合中&#xff0c;人类使用机器的能力来增强自身的能力&#xff0c;而机器则依赖人类的指导和判断来发挥作用。这种融合可以带来许多好处和机会&#xff0c;但也伴随着一些挑战和风险。 首先&#xff0c;人机融合可以为人类…

【线程池】Java线程池的内部类Worker详解

目录 一、简介 二、Worker类对象的类图 三、Worker类对象的解释 4.2 Worker继承自AQS有何意义&#xff1f; 四、Worker的主要代码 4.1 运行worker 4.2 worker和ThreadPool的关系 五、Worker源码分析 5.1 Worker实现接口Runnable&#xff0c;执行run方法 5.2 核心方法…

Kafka:Kafka资料整理

一、官网 二、博主文章 1、kafka是什么 • Worktile社区 三、源码解读

基于springboot+Redis的前后端分离项目(三)-【黑马点评】

&#x1f381;&#x1f381;资源文件分享 链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码&#xff1a;eh11 优惠券秒杀 优惠券秒杀1 -全局唯一ID2 -Redis实现全局唯一Id3 添加优惠卷4 实现秒杀下单5 库存超卖问题分析6 优惠券秒杀-一人一单…

Docker创建Mysql容器

查看可以安装的mysql镜像: docker search mysql STARS为ok的就是官网支持我们可以安装的版本 拉取最新版本的mysql镜像: docker pull mysql:latest 拉取的时候如果网络不好的话可能会报错,报错后重新拉取就好 拉取成功后查看镜像: docker images 可以看到我已经拉取了…