题目

剑指 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. 序列化二叉树的更多相关文章

  1. 剑指 Offer 37. 序列化二叉树 + 二叉树的层次遍历

    剑指 Offer 37. 序列化二叉树 Offer_37 题目描述 题目解析 本题主要考察的就是二叉树的层次遍历. 层次遍历时可以根据二叉树的特点将空结点也进栈. 反序列化时同样可以根据层次遍历的思路 ...

  2. 力扣 - 剑指 Offer 55 - I. 二叉树的深度

    题目 剑指 Offer 55 - I. 二叉树的深度 思路1(DFS) 后续遍历吧,先遍历到最深(递归到末尾返回0),然后从后面一步一步比较取大的值返回,每次返回层数都加1, 执行流程是怎样的:比如其 ...

  3. 【Java】 剑指offer(37) 序列化二叉树

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现两个函数,分别用来序列化和反序列化二叉树. 思路 一般情况下 ...

  4. 每日一题 - 剑指 Offer 37. 序列化二叉树

    题目信息 时间: 2019-06-29 题目链接:Leetcode tag:序列化 二叉树 队列 难易程度:中等 题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树. 示例: 1 / \ 2 ...

  5. 【剑指Offer】序列化二叉树 解题报告(Python)

    [剑指Offer]序列化二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  6. 力扣 - 剑指 Offer 55 - II. 平衡二叉树

    题目 剑指 Offer 55 - II. 平衡二叉树 思路1(后序遍历+剪枝) 这题是上一题剑指 Offer 55 - I. 二叉树的深度的进阶,逻辑代码和那个一样,也是后续遍历,获取两个子节点较大的 ...

  7. 力扣 - 剑指 Offer 27. 二叉树的镜像

    题目 剑指 Offer 27. 二叉树的镜像 思路1(递归) 我们可以使用深度优先搜索,先递归到链表的末尾,然后从末尾开始两两交换.就相当于后续遍历而已 记得要先保存下来node.right节点,因为 ...

  8. Go语言实现:【剑指offer】序列化二叉树

    该题目来源于牛客网<剑指offer>专题. 请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建 ...

  9. 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器

    剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...

随机推荐

  1. Adobe DreamWeaver CC 快捷键

    1 1 ADOBE DREAMWEAVER CC Shortcuts: DREAMWEAVER CC DOCUMENT EDITING SHORTCUTS Select Dreamweaver > ...

  2. involution 内卷化

    involution 内卷化 虽然不熟悉 involution,但是我想起另外两个常用词:evolution(进化)和 revolution(革命). 它们共同的词根volute,拉丁语原意是&quo ...

  3. X-Frame-Options & iframe & CORS

    X-Frame-Options & iframe & CORS https://github.com/xgqfrms/FEIQA/issues/23 X-Frame-Options i ...

  4. Flipper & React Native

    Flipper & React Native Flipper Flipper是一款用于调试移动应用程序的出色开发人员工具,在Android和iOS社区中颇受欢迎. Flipper is a g ...

  5. Web Share API

    Web Share API https://w3c.github.io/web-share/ Web Share API, W3C Editor's Draft 15 April 2020 https ...

  6. git in depth

    git in depth git delete remote branch # Deleting remote branches in Git $ git push origin --delete f ...

  7. Flutter: 下拉刷新,上拉加载更多

    import 'package:flutter/material.dart'; import 'package:english_words/english_words.dart'; void main ...

  8. NGK乘势而上打造生态所,建立全方位的区块链生态系统

    当金融理财变成了生活的一部分,购买金融衍生品的眼光成为了影响生活质量重要组成部分.这是一个不缺少黄金的年代,一夜间实现财务自由的故事每天都在上演,但是由于太多人缺少发现黄金的眼睛,只能被财富和机遇拒之 ...

  9. 谁能成为数据储存领域领头羊?永久数据存储--NGK的终极使命!

    区块链的目的是永远存储交易网络的历史.NGK技术团队能够永久存储其去中心化账本的副本.这是其日后能进行审计关键.一些著名的团队,如Solana和SKALE,现在正在为此与NGK进行最后的集成,我们预计 ...

  10. Java自学第6期——Collection、Map、迭代器、泛型、可变参数、集合工具类、集合数据结构、Debug

    集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. 数组中存储的是同一类型的元素,可以存储基本数据类型值. ...