力扣 - 剑指 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 著作权归领扣网络所有 ...
随机推荐
- JavaScript 注释规范
JavaScript 注释规范 总原则 As short as possible(如无必要,勿增注释).尽量提高代码本身的清晰性.可读性. As long as necessary(如有必要,尽量详尽 ...
- HTTPS All In One
HTTPS All In One HTTPS & web security HTTPS Hypertext Transfer Protocol Secure HTTPS is an exten ...
- Keep Fitness
Keep Fitness 健身 keep health 训练流程 Part 1 热身 5-10分钟 Part 2 肌肉力量训练 30分钟 大肌群包括:胸.背.腿.臀: 小肌群包括:肩.二头肌.三头肌. ...
- historyReverser & array reverse
historyReverser & array reverse\ "use strict"; /** * * @author xgqfrms * @license MIT ...
- VAST生态驱动下,NGK算力增量效应初现!
VAST维萨币上线的消息放出来之后,NGK算力的价格一直在上涨,其实这也不难理解,因为VAST维萨币需要VAST星光值进行兑换,VAST星光值又需要SPC算力福利代币进行挖矿释放的,SPC算力福利代币 ...
- python 相对路径和绝对路径的区别
一,Python中获得当前目录和上级目录 获取当前文件的路径: from os import path d = path.dirname(__file__) #返回当前文件所在的目录 # __file ...
- SQL EXPLAIN解析
本文转载自MySQL性能优化最佳实践 - 08 SQL EXPLAIN解析 什么是归并排序? 如果需要排序的数据超过了sort_buffer_size的大小,说明无法在内存中完成排序,就需要写到临时文 ...
- Python安装教程
1.下载好Python安装包后,双击打开(第一个是32位,第二个是64位,根据自己电脑位数进行选择): 2.打开后如下,先将下方的Python添加到系统环境变量勾选上,再点击第一个默认安装即可: 3. ...
- WPF MVVM实例三
在没给大家讲解wpf mwm示例之前先给大家简单说下MVVM理论知识: WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时 ...
- IDEA总结
1. 什么是idea? idea是Java开发软件 2. IDEA下载 https://www.jetbrains.com/idea/download/download-thanks.html?pla ...