It's easy to find if you know what you're looking for.
如果你知道自己想追求什么,就很容易成功。
问题描述
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
BFS解决
这题上面说了一大堆,其实就是把二叉树转化为一个字符串,并且还能把这个字符串还原成原来的二叉树就可以了。
把二叉树转化为字符串可以有很多种方式,比如前序遍历,中序遍历,后续遍历,BFS,DFS都是可以的,对于树的各种遍历具体可以看下373,数据结构-6,树。但这题还要求把字符串再还原成原来的二叉树。最容易想到的就是BFS,就是一层一层从往下遍历
来看下代码
1public class Codec { 2 3 //把树转化为字符串(使用BFS遍历) 4 public String serialize(TreeNode root) { 5 //边界判断,如果为空就返回一个字符串"#" 6 if (root == null) 7 return "#"; 8 //创建一个队列 9 Queue<TreeNode> queue = new LinkedList<>();10 StringBuilder res = new StringBuilder();11 //把根节点加入到队列中12 queue.add(root);13 while (!queue.isEmpty()) {14 //节点出队15 TreeNode node = queue.poll();16 //如果节点为空,添加一个字符"#"作为空的节点17 if (node == null) {18 res.append("#,");19 continue;20 }21 //如果节点不为空,把当前节点的值加入到字符串中,22 //注意节点之间都是以逗号","分隔的,在下面把字符23 //串还原二叉树的时候也是以逗号","把字符串进行拆分24 res.append(node.val + ",");25 //左子节点加入到队列中(左子节点有可能为空)26 queue.add(node.left);27 //右子节点加入到队列中(右子节点有可能为空)28 queue.add(node.right);29 }30 return res.toString();31 }3233 //把字符串还原为二叉树34 public TreeNode deserialize(String data) {35 //如果是"#",就表示一个空的节点36 if (data == "#")37 return null;38 Queue<TreeNode> queue = new LinkedList<>();39 //因为上面每个节点之间是以逗号","分隔的,所以这里40 //也要以逗号","来进行拆分41 String[] values = data.split(",");42 //上面使用的是BFS,所以第一个值就是根节点的值,这里创建根节点43 TreeNode root = new TreeNode(Integer.parseInt(values[0]));44 queue.add(root);45 for (int i = 1; i < values.length; i++) {46 //队列中节点出栈47 TreeNode parent = queue.poll();48 //因为在BFS中左右子节点是成对出现的,所以这里挨着的两个值一个是49 //左子节点的值一个是右子节点的值,当前值如果是"#"就表示这个子节点50 //是空的,如果不是"#"就表示不是空的51 if (!"#".equals(values[i])) {52 TreeNode left = new TreeNode(Integer.parseInt(values[i]));53 parent.left = left;54 queue.add(left);55 }56 //上面如果不为空就是左子节点的值,这里是右子节点的值,注意这里有个i++,57 if (!"#".equals(values[++i])) {58 TreeNode right = new TreeNode(Integer.parseInt(values[i]));59 parent.right = right;60 queue.add(right);61 }62 }63 return root;64 }65}
DFS解决
DFS遍历是从根节点开始,一直往左子节点走,当到达叶子节点的时候会返回到父节点,然后从从父节点的右子节点继续遍历……
1class Codec { 2 3 //把树转化为字符串(使用DFS遍历,也是前序遍历,顺序是:根节点→左子树→右子树) 4 public String serialize(TreeNode root) { 5 //边界判断,如果为空就返回一个字符串"#" 6 if (root == null) 7 return "#"; 8 return root.val + "," + serialize(root.left) + "," + serialize(root.right); 9 }1011 //把字符串还原为二叉树12 public TreeNode deserialize(String data) {13 //把字符串data以逗号","拆分,拆分之后存储到队列中14 Queue<String> queue = new LinkedList<>(Arrays.asList(data.split(",")));15 return helper(queue);16 }1718 private TreeNode helper(Queue<String> queue) {19 //出队20 String sVal = queue.poll();21 //如果是"#"表示空节点22 if ("#".equals(sVal))23 return null;24 //否则创建当前节点25 TreeNode root = new TreeNode(Integer.valueOf(sVal));26 //分别创建左子树和右子树27 root.left = helper(queue);28 root.right = helper(queue);29 return root;30 }31}
总结
把二叉树转化为字符串很简单,关键是怎么把转化的字符串再还原成原来的二叉树,这里使用BFS和DFS都很容易实现。
●442,剑指 Offer-回溯算法解二叉树中和为某一值的路径
长按上图,识别图中二维码之后即可关注。
如果觉得有用就点个"赞"吧
Original url: Access
Created at: 2020-08-28 15:42:31
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论