文章目录

  • 题目描述
  • 思路 && 代码
    • 二刷

题目描述

  • 这道题涉及到不少 String、StringBuilder、Integer的转换、处理。

思路 && 代码

  • 序列化:迭代进行一个层序遍历,逐个加入结果字符串中。
  • 反序列化:根据序列化得到的结果字符串,同样是借助队列,进行层序遍历来构造出二叉树。
  • 总的来说,是需要多敲几遍的题(String等类的用法)
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
public class Codec {// 知识点:String、StringBuilder、parseInt的处理// Encodes a tree to a single string.public String serialize(TreeNode root) {if(root == null) {return "[]";}StringBuilder res = new StringBuilder("[");Queue<TreeNode> queue = new LinkedList<>();queue.add(root);// 层序遍历 BFS(迭代) while(!queue.isEmpty()) {TreeNode temp = queue.poll();if(temp != null) {// 当前值加入 res,子结点加入 queueres.append(temp.val).append(",");queue.add(temp.left);queue.add(temp.right);}// 空结点 情况else {res.append("null,");}}// 删除末尾的','res.delete(res.length() - 1, res.length());res.append("]");return res.toString();}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {if(data.equals("[]")) {return null;}// 1. initString[] vals = data.substring(1, data.length() - 1).split(",");TreeNode root = new TreeNode(Integer.parseInt(vals[0]));Queue<TreeNode> queue = new LinkedList<>();queue.add(root);// 2. deserializefor(int i = 1; !queue.isEmpty(); i += 2) {TreeNode temp = queue.poll();// 左结点判断if(!vals[i].equals("null")) {temp.left = new TreeNode(Integer.parseInt(vals[i]));queue.add(temp.left);}// 右结点判断if(!vals[i + 1].equals("null")) {temp.right = new TreeNode(Integer.parseInt(vals[i + 1]));queue.add(temp.right);}}return root;}
}// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));

二刷

  • 序列化格式:逗号’,'作为分割符,“null” 作为空节点。按照层序遍历序列化
  • 注意:序列化、反序列都需要队列辅助
public class Codec {public String serialize(TreeNode root) {if(root == null) {return "";}StringBuilder sb = new StringBuilder();LinkedList<TreeNode> queue = new LinkedList<>();queue.add(root);while(!queue.isEmpty()) {TreeNode temp = queue.poll();if(temp == null) {sb.append("null,");}else {sb.append(temp.val).append(',');queue.add(temp.left);queue.add(temp.right);}}return sb.toString();}public TreeNode deserialize(String data) {if(data.length() == 0) {return null;}String[] vals = data.split(",");TreeNode root = new TreeNode(Integer.parseInt(vals[0]));LinkedList<TreeNode> queue = new LinkedList<>(); // 还是需要辅助队列queue.add(root);for(int i = 1; i < vals.length; i += 2) {TreeNode temp = queue.poll();if(!vals[i].equals("null")) {temp.left = new TreeNode(Integer.parseInt(vals[i]));queue.add(temp.left);}if(!vals[i + 1].equals("null")) {temp.right = new TreeNode(Integer.parseInt(vals[i + 1]));queue.add(temp.right);}}return root;}
}

【LeetCode笔记】剑指Offer 37. 序列化二叉树(Java、二叉树、序列化、BFS、队列)相关推荐

  1. 【LeetCode】剑指 Offer 37. 序列化二叉树

    [LeetCode]剑指 Offer 37. 序列化二叉树 文章目录 [LeetCode]剑指 Offer 37. 序列化二叉树 package offer;import java.util.Link ...

  2. 【leetcode】 剑指 Offer学习计划(java版本含注释)(上)

    目录 前言 第一天(栈与队列) 剑指 Offer 09. 用两个栈实现队列(简单) 剑指 Offer 30. 包含min函数的栈(简单) 第二天(链表) 剑指 Offer 06. 从尾到头打印链表(简 ...

  3. 【LeetCode】剑指 Offer 34. 二叉树中和为某一值的路径

    [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径 文章目录 [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径 package offer;import ja ...

  4. 【LeetCode】剑指 Offer 32 - III. 从上到下打印二叉树 III

    [LeetCode]剑指 Offer 32 - III. 从上到下打印二叉树 III 文章目录 [LeetCode]剑指 Offer 32 - III. 从上到下打印二叉树 III package o ...

  5. 【LeetCode】剑指 Offer 07. 重建二叉树

    [LeetCode]剑指 Offer 07. 重建二叉树 文章目录 [LeetCode]剑指 Offer 07. 重建二叉树 package offer;import java.util.ArrayD ...

  6. 【LeetCode】剑指 Offer 32 - II. 从上到下打印二叉树 II

    [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 文章目录 [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 一.层序遍历 BFS 一. ...

  7. 【LeetCode】剑指 Offer 28. 对称的二叉树

    [LeetCode]剑指 Offer 28. 对称的二叉树 文章目录 [LeetCode]剑指 Offer 28. 对称的二叉树 一.递归 一.递归 对称二叉树定义:对于书中任意两个对称结点 L 和 ...

  8. 【LeetCode】剑指 Offer 68 - II. 二叉树的最近公共祖先

    [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 文章目录 [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 一.DFS 一.DFS 祖先的定义 ...

  9. 【LeetCode】剑指 Offer 27. 二叉树的镜像

    [LeetCode]剑指 Offer 27. 二叉树的镜像 文章目录 [LeetCode]剑指 Offer 27. 二叉树的镜像 一.递归法 二.辅助栈(或队列) 一.递归法 根据二叉树镜像的定义,考 ...

  10. 【LeetCode】剑指 Offer 55 - I. 二叉树的深度

    [LeetCode]剑指 Offer 55 - I. 二叉树的深度 文章目录 [LeetCode]剑指 Offer 55 - I. 二叉树的深度 一.后序遍历(DFS) 二.层序遍历 一.后序遍历(D ...

最新文章

  1. canopy算法 java_mahout源码canopy算法分析之二CanopyMapper
  2. oracle计算最大与最小之间数,oracle 分析函数
  3. 工作流实战_04_flowable 流程的模板的图片和xml显示
  4. 客户端可以连接 .Net程序不能连接SQL Server 2000
  5. 冒泡排序(数组排序不用Array.Sort)
  6. IE下载xlsx、docx、pptx文件时自动变成zip文件问题
  7. 【实习之T100开发】T100 单档程序开发,java工程师面试突击中华石杉
  8. 网站添加cdn加速服务器,网站使用腾讯云cdn加速操作实战
  9. 预计招收300人,北京大学信息工程学院2022年夏令营开启报名
  10. 快速清除系统中的木马病毒
  11. position的8种定位方式
  12. 赛扬J4105和赛扬N5095哪个好
  13. HDFS名字空间(NameSpace)
  14. Android HAL层分析 (gralloc显示模块 举例)
  15. java web相册_javaWEB实现相册管理的简单功能
  16. 为什么超算/先进计算会成为各国竞争的战略高地?
  17. K8s二进制部署-flanneld报(Couldn‘t fetch network config)
  18. Mysql项目 github_GitHub开源项目2018-09-11更新精选
  19. html自动布局框架,html布局 百分比自适应框架网页模板
  20. Python:字符串基操_strip()/rstrip()/lstrip()_lower()/upper()_startswith()/endswith()_split()/rspilt()_join

热门文章

  1. python 求最大值实例_Python 求数组局部最大值的实例
  2. mysql事务嵌套 php_使用以下代码,MySQL中的PHP“嵌套”事务是否...
  3. github里的默认域_恕我直言!你对Python里的import一无所知
  4. python交叉验证函数_python – 在sklearn中使用交叉验证和AUC-ROC作为逻辑回归模型...
  5. 数模写作必备利器—latex
  6. Batch Normalization原理及pytorch的nn.BatchNorm2d函数
  7. The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
  8. Spring Data JPA 从入门到精通~实际工作的应用场景
  9. Windows平台下GO语言编译器(GO-windows)
  10. 计算机网络技术专业的规划,计算机网络技术专业建设规划