BM39 序列化二叉树
描述
请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。
二叉树的序列化(Serialize)是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树等遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#)
二叉树的反序列化(Deserialize)是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
例如,可以根据层序遍历的方案序列化,如下图:
层序序列化(即用函数Serialize转化)如上的二叉树转为"{1,2,3,#,#,6,7}",再能够调用反序列化(Deserialize)将"{1,2,3,#,#,6,7}"构造成如上的二叉树。
当然你也可以根据满二叉树结点位置的标号规律来序列化,还可以根据先序遍历和中序遍历的结果来序列化。不对序列化之后的字符串进行约束,所以欢迎各种奇思妙想。
数据范围:节点数n≤100,树上每个节点的值满足0≤val≤150
要求:序列化和反序列化都是空间复杂度O(n),时间复杂度O(n)
示例1
输入:
{1,2,3,#,#,6,7}
返回值:
{1,2,3,#,#,6,7}
说明:
如题面图
示例2
输入:
{8,6,10,5,7,9,11}
返回值:
{8,6,10,5,7,9,11}
- 采用前序遍历的方式构造字符串并恢复树
- 序列化过程
- 递归函数退出条件是当节点为空,则返回
"#"
。我们一定要用一个"#"
来实现占位的操作,这样才能保证我们的树是唯一的,否则单独前序遍历出来的字符串是无法恢复成唯一的一棵树的 - 然后我们递归地返回
当前值+","+递归左子节点+","+递归右子节点
- 递归函数退出条件是当节点为空,则返回
- 反序列化过程
- 我们引入了一个新的结构queue来储存字符串分割后的前序遍历结果
- 由于前序遍历,我们首先从queue中取出队首,将其对象化成为一个节点
- 然后将左子节点值设为递归这个queue的函数返回结果
- 然后将右子节点值设为递归这个queue的函数返回结果
- 这正好符合了前序遍历的规则,我们倒着又建立了这棵
/*
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}}
*/
import java.util.*;
public class Solution {StringBuilder s=new StringBuilder();String Serialize(TreeNode root) {if(root==null){return "#";}return root.val+","+Serialize(root.left)+","+Serialize(root.right);}public TreeNode create(Deque<String> dq){String s=dq.poll();if(s.equals("#")){return null;}TreeNode head=new TreeNode(Integer.valueOf(s));head.left=create(dq);head.right=create(dq);return head;}TreeNode Deserialize(String str) {String[] st=str.split(","); //将字符串分割形成列表Deque<String> dq=new LinkedList<>();for(int i=0;i<st.length;i++){dq.offer(st[i]); //将列表值进队列}TreeNode head=create(dq); //创建树return head;}
}
BM39 序列化二叉树相关推荐
- 剑指offer:面试题37. 序列化二叉树
题目:序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树. 示例: 你可以将以下二叉树: 1 / \ 2 3 / \ 4 5 序列化为 "[1 ...
- 《剑指offer》-- 序列化二叉树、二叉搜索树的第k个节点、数据流中的中位数、滑动窗口的最大值
一.序列化二叉树: 1.题目: 请实现两个函数,分别用来序列化和反序列化二叉树. 2.解题思路: (1)根据前序遍历规则完成序列化与反序列化.所谓序列化指的是遍历二叉树为字符串:所谓反序列化指的是依据 ...
- [二叉树]序列化二叉树 (剑指offer61)
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 解题思路 序列化二叉树:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串.需要注意的是,序列化二叉树的过程中,如果遇到空节点,需要以 ...
- 剑指 Offer 37. 序列化二叉树
题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来实 ...
- 《剑指Offer》37:序列化二叉树
题目 请实现两个函数,分别用来序列化和反序列化二叉树. 分析 我们清楚可以通过前序遍历序列和中序遍历序列创造出一棵二叉树.因此,我们可以先把一棵二叉树序列化成一个前序遍历序列和一个中序遍历序列,然后在 ...
- 【LeetCode】剑指 Offer 37. 序列化二叉树
[LeetCode]剑指 Offer 37. 序列化二叉树 文章目录 [LeetCode]剑指 Offer 37. 序列化二叉树 package offer;import java.util.Link ...
- 剑指offer(61)序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 题目分析 首先拿到题目时候,我先想到的是什么是序列化二叉树?序列化主要就是在前后端交互时候需要转换下,毕竟网络传输的是流式数据(二进制或者文本 ...
- 【重点】剑指offer——面试题62:序列化二叉树
剑指offer--面试题62:序列化二叉树 Solution1: 参考网址:https://www.nowcoder.com/profile/6475323/codeBookDetail?submis ...
- 35-剑指 Offer 37. 序列化二叉树
题目 请实现两个函数,分别用来序列化和反序列化二叉树. 你需要设计一个算法来实现二叉树的序列化与反序列化.这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并 ...
最新文章
- tensorflow tf.Variable 的用法
- iOS网络编程开发—HTTP协议
- malloc动态分配多维数组
- 无法载入增效工具_山东省 智能工具箱 智能工具管理 工具管理企业数字化管理...
- mysql 创建查询 删除_MYSQL数据库查询删除创建企业基本知识
- String.format() 方法用法解说
- 建设自己拥有的B2C网站一般需要什么样的插件以及大体花费
- 算法导论9.1-1习题解答(二叉树)
- 昨天又发火了:领导拒不给他人安排工作
- postman下载安装汉化及使用
- Win7/8/10系统下Protel 99 SE不能添加元件库 File is not recognized
- 【飞思卡尔】飞思卡尔摄像头算法基本方法
- POJ 1185 炮兵阵地
- WTEM-1Q/GPS瞬变电磁仪操作步骤
- 最优化方法 18:近似点算子 Proximal Mapping
- 2018GIAC全球互联网架构大会上海站最新日程抢先看!
- Android开发的各个领域发展前景?路线?规划未来看这篇
- bigDecimal除法取整数
- 字节数组与字节流、缓冲字节流、字符流、缓冲字符流、对象流
- 使用Matlab画出复杂网络博弈中热图(三维图)(学术论文)
热门文章
- boost::python::enum_相关的测试程序
- boost::mpl模块实现unique相关的测试程序
- 使用 Boost.MPI 的 reduce() 计算最小值的示例
- VTK:可视化之MoveActor
- VTK:图片之ImageMagnify
- C++Rabin Karp算法字符串快速查找(附完整源码)
- C++使用数组实现stack堆栈(附完整源码)
- C语言实现镜子mirror算法(附完整源码)
- C语言实现升序优先队列Ascending priority queue(附完整源码)
- QT的QWGLNativeContext类的使用