题目描述:

  请实现两个函数,分别用来序列化和反序列化二叉树。

  解题思路:

  序列化是指将结构化的对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程。反序列化是指将字节流转回结构化的对象的过程,是序列化的逆过程。

  受第4题:重建二叉树的启发,我们知道从前序遍历和中序遍历序列中可以构造出一棵二叉树,因此将一棵二叉树序列化为一个前序遍历序列和一个中序遍历序列,然后在反序列化时用第四题的思路重建二叉树。

  这种思路是可行的,但是存在两个缺点:一是该方法要求二叉树中不能有重复的结点(比如我们通过前序知道根是1,若有重复的结点无法在中序序列中定位根的位置);二是只有当两个序列中所有的数据都读出后才能开始反序列化,如果两个遍历序列是从一个流中读出来的,那么可能需要等待较长的时间。

  因此,这里我们采用另外一种方法,即只根据前序遍历的顺序来进行序列化,前序遍历是从根结点开始,在遍历二叉树碰到null指针时,就将其序列化为一个特殊字符,比如$,另外,结点的数值之间用一个特殊字符(比如,)进行分隔。比如对于以下的树,序列化为字符串:"1,2,4,$,$,$,3,5,$,$,6,$,$"

![](https://img2018.cnblogs.com/blog/1608161/201905/1608161-20190521111824678-471667484.png)

  然后我们可以以"1,2,4,$,$,$,3,5,$,$,6,$,$"为例来分析反序列化的过程,第一个读出1,这是根结点的值,然后读出2,这是根结点的左孩子,同样接下来的4是值为2的结点的左孩子结点;接下来读出两个“\(”,说明值为4的结点左右孩子都是null,这是一个叶结点。然后回到值为2的结点,重建它的右子树,由于下一个字符是“\)”,说明值为2的结点的右孩子结点为null,这个结点的左右子树都重建完毕,接下来再次回溯就到了根结点,所以,左子树重构完毕。

  由于下一个数字是3,所以右子树的根结点值为3,左结点时一个值为5的叶结点(因为接下来的三个字符是5,$,$),同理右结点时一个值为6的结点。至此,重构完毕,反序列化完成。

  序列化比较简单,就是一个前序遍历的过程,而反序列化也不难发现,实际就是一个递归解决每个子树的问题,详见以下代码实现。

  编程实现(Java):

public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null; public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
String Serialize(TreeNode root) {
// 序列化为前序遍历序列,空节点用#表示
String str = "";
return Serialize(root, str);
}
String Serialize(TreeNode root, String str) {
if (root == null) { //序列化根节点
str += "#,";
return str;
} else
str += root.val+",";
str = Serialize(root.left, str); //序列化左子树
str = Serialize(root.right, str); //序列化右子树
return str;
} int start=-1;
//反序列化,根据序列重构建树
TreeNode Deserialize(String str) {
if (str == null || str.length() == 0)
return null;
String[] strArr = str.split(",");
return Deserialize(strArr);
} TreeNode Deserialize(String[] strArr) {
start++;
if (start < strArr.length && !strArr[start].equals("#")) {
TreeNode cur = new TreeNode(Integer.parseInt(strArr[start]));
cur.left = Deserialize(strArr);
cur.right = Deserialize(strArr);
return cur;
}
return null;
}
}

【剑指Offer】61、序列化二叉树的更多相关文章

  1. 剑指Offer 61. 序列化二叉树 (二叉树)

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 题目地址 https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84 ...

  2. [剑指Offer] 61.序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *r ...

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

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

  4. 力扣 - 剑指 Offer 37. 序列化二叉树

    目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 37. 序列化二叉树 思路 序列化其实就是层序遍历 但是,要能反序列化的话,前.中.后.层序遍历是不够的,必须在序列化时候保存所有信息,这样 ...

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

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

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

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

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

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

  8. 剑指offer:序列化二叉树

    题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树 思路分析: 这里一开始有点不明白题目的意思.实际上序列化应该指把二叉树用某种编码方式表示,这里一般是字符串的形式.而反序列就是将之前生成的序 ...

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

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

  10. 剑指offer——31序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树   二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存.序列化可以基于先 ...

随机推荐

  1. open cursor too much error

    今天遇到一个错误ORA-01000: maximum open cursors exceeded. 客户想增加 DB 的open_cursor这个参数. 但是我看了下,她的程序要打开几千个cursor ...

  2. ASP.NET—016:ASP.NET中保存文件对话框

    本想在asp.net中使用savediallog保存文件,结果提示:当应用程序不是以 UserInteractive 模式执行时显示模式对话框或窗口是无效操作. 在ASP.NET中使用例如以下方式.保 ...

  3. 【搜索】 HDU 3533 Escape BFS 预处理

    要从0,0 点 跑到m,n点  路上会有k个堡垒发射子弹.有子弹的地方不能走,子弹打到别的堡垒就会消失,或者一直飞出边界(人不能经过堡垒 能够上下左右或者站着不动 每步都须要消耗能量  一共同拥有en ...

  4. 一篇文章贯穿ACE各种发送接收组件 1.2版

    TCP通信过程介绍 首先介绍一下socket通信的基本过程:这里先如果有两个家伙在通信,一个是S.还有一个叫C (1)S打开port监听本地的port看看有没有人来连接: (2)与此同一时候C试图去连 ...

  5. Servlet仿CSDN动态验证码的生成-带数字和字母

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.实现的思路: (1)首先,须要创建一个Servlet.该Servlet通过字节型响应给cl ...

  6. Unreal Engine 4 Camera Lag(摄影机延迟)

    以官方的Third Person Template为样例,Character蓝图中的USpringArmComponent就实现了摄影机和场景碰撞和交互等大部分的功能了. 要实现摄影机延时,仅仅须要改 ...

  7. 关于MySQL错误 2005 - Unknown MySQL server host 'localhost' (0) 原因及解决方法

    今天在外面开navicat for mysql的时候,怎么也连不上自己本机上的数据库,一直显示2005 - Unknown MySQL server host 'localhost' (0): 错误代 ...

  8. 0.0.0.0 IPAddress.Any 【】127.0.0.1 IPAddress.Loopback 【】localhost

    0.0.0.0  IPAddress.Any https://msdn.microsoft.com/en-us/library/system.net.ipaddress.any(v=vs.110).a ...

  9. hdoj--5619--Jam's store(最小费用最大流)

    Jam's store Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

  10. 截取字符(substr)检索字符位置(instr)

    1.SUBSTR(string,start_position,[length]) 求子字符串,返回字符串注释: string 元字符串start_position 开始位置(从0开始)length 可 ...