【LeetCode笔记】剑指Offer 37. 序列化二叉树(Java、二叉树、序列化、BFS、队列)
文章目录
- 题目描述
- 思路 && 代码
- 二刷
题目描述
- 这道题涉及到不少 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、队列)相关推荐
- 【LeetCode】剑指 Offer 37. 序列化二叉树
[LeetCode]剑指 Offer 37. 序列化二叉树 文章目录 [LeetCode]剑指 Offer 37. 序列化二叉树 package offer;import java.util.Link ...
- 【leetcode】 剑指 Offer学习计划(java版本含注释)(上)
目录 前言 第一天(栈与队列) 剑指 Offer 09. 用两个栈实现队列(简单) 剑指 Offer 30. 包含min函数的栈(简单) 第二天(链表) 剑指 Offer 06. 从尾到头打印链表(简 ...
- 【LeetCode】剑指 Offer 34. 二叉树中和为某一值的路径
[LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径 文章目录 [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径 package offer;import ja ...
- 【LeetCode】剑指 Offer 32 - III. 从上到下打印二叉树 III
[LeetCode]剑指 Offer 32 - III. 从上到下打印二叉树 III 文章目录 [LeetCode]剑指 Offer 32 - III. 从上到下打印二叉树 III package o ...
- 【LeetCode】剑指 Offer 07. 重建二叉树
[LeetCode]剑指 Offer 07. 重建二叉树 文章目录 [LeetCode]剑指 Offer 07. 重建二叉树 package offer;import java.util.ArrayD ...
- 【LeetCode】剑指 Offer 32 - II. 从上到下打印二叉树 II
[LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 文章目录 [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 一.层序遍历 BFS 一. ...
- 【LeetCode】剑指 Offer 28. 对称的二叉树
[LeetCode]剑指 Offer 28. 对称的二叉树 文章目录 [LeetCode]剑指 Offer 28. 对称的二叉树 一.递归 一.递归 对称二叉树定义:对于书中任意两个对称结点 L 和 ...
- 【LeetCode】剑指 Offer 68 - II. 二叉树的最近公共祖先
[LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 文章目录 [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 一.DFS 一.DFS 祖先的定义 ...
- 【LeetCode】剑指 Offer 27. 二叉树的镜像
[LeetCode]剑指 Offer 27. 二叉树的镜像 文章目录 [LeetCode]剑指 Offer 27. 二叉树的镜像 一.递归法 二.辅助栈(或队列) 一.递归法 根据二叉树镜像的定义,考 ...
- 【LeetCode】剑指 Offer 55 - I. 二叉树的深度
[LeetCode]剑指 Offer 55 - I. 二叉树的深度 文章目录 [LeetCode]剑指 Offer 55 - I. 二叉树的深度 一.后序遍历(DFS) 二.层序遍历 一.后序遍历(D ...
最新文章
- canopy算法 java_mahout源码canopy算法分析之二CanopyMapper
- oracle计算最大与最小之间数,oracle 分析函数
- 工作流实战_04_flowable 流程的模板的图片和xml显示
- 客户端可以连接 .Net程序不能连接SQL Server 2000
- 冒泡排序(数组排序不用Array.Sort)
- IE下载xlsx、docx、pptx文件时自动变成zip文件问题
- 【实习之T100开发】T100 单档程序开发,java工程师面试突击中华石杉
- 网站添加cdn加速服务器,网站使用腾讯云cdn加速操作实战
- 预计招收300人,北京大学信息工程学院2022年夏令营开启报名
- 快速清除系统中的木马病毒
- position的8种定位方式
- 赛扬J4105和赛扬N5095哪个好
- HDFS名字空间(NameSpace)
- Android HAL层分析 (gralloc显示模块 举例)
- java web相册_javaWEB实现相册管理的简单功能
- 为什么超算/先进计算会成为各国竞争的战略高地?
- K8s二进制部署-flanneld报(Couldn‘t fetch network config)
- Mysql项目 github_GitHub开源项目2018-09-11更新精选
- html自动布局框架,html布局 百分比自适应框架网页模板
- Python:字符串基操_strip()/rstrip()/lstrip()_lower()/upper()_startswith()/endswith()_split()/rspilt()_join
热门文章
- python 求最大值实例_Python 求数组局部最大值的实例
- mysql事务嵌套 php_使用以下代码,MySQL中的PHP“嵌套”事务是否...
- github里的默认域_恕我直言!你对Python里的import一无所知
- python交叉验证函数_python – 在sklearn中使用交叉验证和AUC-ROC作为逻辑回归模型...
- 数模写作必备利器—latex
- Batch Normalization原理及pytorch的nn.BatchNorm2d函数
- The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
- Spring Data JPA 从入门到精通~实际工作的应用场景
- Windows平台下GO语言编译器(GO-windows)
- 计算机网络技术专业的规划,计算机网络技术专业建设规划