力扣 - 剑指 Offer 37. 序列化二叉树
题目
思路
- 序列化其实就是层序遍历
- 但是,要能反序列化的话,前、中、后、层序遍历是不够的,必须在序列化时候保存所有信息,这样子反序列化才可以完全恢复一颗树
- 利用层序遍历,在遍历时候同时计算序列化结果,注意最后一个没有逗号
- 反序列化其实也是使用了层序遍历
- 由于起始位置是0,可以得出,索引位置为n的结点他的左孩子的索引为
n*2+1,右孩子索引为n*2+2 - 从头开始遍历结点时候,判断孩子是否为null:不为null才为其构造结点作为其孩子,且将孩子结点入队,如果是null就跳过,判断下一个结点
- 注意,每次循环结束要将index加一,因为进入到下一个结点的判断了嘛
代码
public class Codec {
public String serialize(TreeNode root) {
// 如果是空树,就直接返回[]
if (root == null) {
return "[]";
}
// 使用队列进行层序遍历
Deque<TreeNode> queue = new LinkedList<>();
// 用来存储结果
StringBuilder res = new StringBuilder("[");
queue.offer(root);
// 在层序遍历时候完成字符串的拼接
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
// 如果为空就添加null进去否则添加结点的值进去
if (node == null) {
res.append("null,");
} else {
res.append(node.val + ",");
queue.offer(node.left);
queue.offer(node.right);
}
}
// 删除最后一个逗号
res.deleteCharAt(res.length() - 1);
// 将右括号加上
res.append("]");
// 返回序列化的字符串
return res.toString();
}
public TreeNode deserialize(String data) {
// 如果传入的是空的字符串,那么就直接返回null
if ("[]".equals(data)) {
return null;
}
// 将字符串进行拆分成数据
String[] values = data.substring(1, data.length() - 1).split("\\,");
// 初始化根节点
TreeNode root = new TreeNode(Integer.parseInt(values[0]));
Deque<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int index = 0;
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
// 判断左孩子是否为空
if (!"null".equals(values[index*2 + 1])) {
node.left = new TreeNode(Integer.parseInt(values[index*2 + 1]));
queue.offer(node.left);
}
// 判断右孩子是否为空
if (!"null".equals(values[index*2 + 2])) {
node.right = new TreeNode(Integer.parseInt(values[index*2 + 2]));
queue.offer(node.right);
}
// index++代表进入下一个结点的判断
index++;
}
// 返回反序列化的二叉树
return root;
}
}
复杂度分析
- 序列化:
- 时间复杂度:\(O(N)\),其中 N 为二叉树的节点数
- 空间复杂度:\(O(N)\),其中 N 为二叉树的节点数
- 反序列化
- 时间复杂度:\(O(N)\),其中 N 为二叉树的节点数
- 空间复杂度:\(O(N)\),其中 N 为二叉树的节点数
力扣 - 剑指 Offer 37. 序列化二叉树的更多相关文章
- 剑指 Offer 37. 序列化二叉树 + 二叉树的层次遍历
剑指 Offer 37. 序列化二叉树 Offer_37 题目描述 题目解析 本题主要考察的就是二叉树的层次遍历. 层次遍历时可以根据二叉树的特点将空结点也进栈. 反序列化时同样可以根据层次遍历的思路 ...
- 力扣 - 剑指 Offer 55 - I. 二叉树的深度
题目 剑指 Offer 55 - I. 二叉树的深度 思路1(DFS) 后续遍历吧,先遍历到最深(递归到末尾返回0),然后从后面一步一步比较取大的值返回,每次返回层数都加1, 执行流程是怎样的:比如其 ...
- 【Java】 剑指offer(37) 序列化二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现两个函数,分别用来序列化和反序列化二叉树. 思路 一般情况下 ...
- 每日一题 - 剑指 Offer 37. 序列化二叉树
题目信息 时间: 2019-06-29 题目链接:Leetcode tag:序列化 二叉树 队列 难易程度:中等 题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树. 示例: 1 / \ 2 ...
- 【剑指Offer】序列化二叉树 解题报告(Python)
[剑指Offer]序列化二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...
- 力扣 - 剑指 Offer 55 - II. 平衡二叉树
题目 剑指 Offer 55 - II. 平衡二叉树 思路1(后序遍历+剪枝) 这题是上一题剑指 Offer 55 - I. 二叉树的深度的进阶,逻辑代码和那个一样,也是后续遍历,获取两个子节点较大的 ...
- 力扣 - 剑指 Offer 27. 二叉树的镜像
题目 剑指 Offer 27. 二叉树的镜像 思路1(递归) 我们可以使用深度优先搜索,先递归到链表的末尾,然后从末尾开始两两交换.就相当于后续遍历而已 记得要先保存下来node.right节点,因为 ...
- Go语言实现:【剑指offer】序列化二叉树
该题目来源于牛客网<剑指offer>专题. 请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建 ...
- 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器
剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...
随机推荐
- HTTP2.0 的学习笔记
1 1 1 HTTP2.0 1 11 1 1 1 1 1 1 超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,也被称为HTTP ove ...
- 如何在 macOS 上搭建 PHP 开发环境
如何在 macOS 上搭建 PHP 开发环境 Linux, Nginx, MySQL, PHP $ php --version $ php -v # PHP 7.3.11 (cli) (built: ...
- vue & vue router & dynamic router
vue & vue router & dynamic router https://router.vuejs.org/guide/essentials/dynamic-matching ...
- Dyno-queues 分布式延迟队列 之 生产消费
Dyno-queues 分布式延迟队列 之 生产消费 目录 Dyno-queues 分布式延迟队列 之 生产消费 0x00 摘要 0x01 前情回顾 1.1 设计目标 1.2 选型思路 0x02 产生 ...
- Docker Tips: 关于/var/run/docker.sock
本文转载自Docker Tips: 关于/var/run/docker.sock 导语 你可能已经运行过docker hub上的container并且注意到其中的一些需要绑定挂载(mount)/var ...
- Vue为何采用异步渲染
Vue为何采用异步渲染 Vue在更新DOM时是异步执行的,只要侦听到数据变化,Vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更,如果同一个watcher被多次触发,只会被推入到队列中一次 ...
- JDBC 连接Oracle数据库 各个对象的理解
JDBC: 1. **代码实现:(连接oracle数据库) 1.导入驱动jar包 2.注册驱动 Class.forName("oracle.jdbc.driv ...
- nacos服务注册之服务器端Distro
一致性协议算法Distro阿里自己的创的算法吧,网上能找到的资料很少.Distro用于处理ephemeral类型数据 Distro协议算法看代码大体流程是: nacos启动首先从其他远程节点同步全部数 ...
- xmake v2.5.2 发布, 支持自动拉取交叉工具链和依赖包集成
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...
- 阿里巴巴Druid,轻松实现MySQL数据库连接加密!
为什么要加密? 现在的开发习惯,无论是公司的项目还是个人的项目,都会选择将源码上传到 Git 服务器(GitHub.Gitee 或是自建服务器),但只要将源码提交到公网服务器就会存在源码泄漏的风险,而 ...