首页 > 试题广场 >

序列化二叉树

[编程题]序列化二叉树
  • 热度指数:486351 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。

二叉树的序列化(Serialize)是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树等遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#)

二叉树的反序列化(Deserialize)是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

例如,可以根据层序遍历的方案序列化,如下图:
层序序列化(即用函数Serialize转化)如上的二叉树转为"{1,2,3,#,#,6,7}",再能够调用反序列化(Deserialize)将"{1,2,3,#,#,6,7}"构造成如上的二叉树。

再举一个例子

层序序列化(即用函数Serialize转化)如上的二叉树转为"{5,4,#,3,#,2}",再能够调用反序列化(Deserialize)将"{5,4,#,3,#,2}构造成如上的二叉树。

当然你也可以根据满二叉树结点位置的标号规律来序列化,还可以根据先序遍历和中序遍历的结果来序列化。不对序列化之后的字符串进行约束,所以欢迎各种奇思妙想。

数据范围:节点数 ,树上每个节点的值满足
要求:序列化和反序列化都是空间复杂度 ,时间复杂度
示例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}

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
头像 宫水三叶的刷题日记
发表于 2021-07-04 19:43:04
精华题解 基本思路 无论使用何种「遍历方式」进行二叉树存储,为了方便,我们都需要对空节点有所表示。 其实题目本身的样例就给我们提供了很好的思路:使用层序遍历的方式进行存储,对于某个叶子节点的空节点进行存储,同时确保不递归存储空节点对应的子节点。 层序遍历 我们使用 0x3f3f3f3f 作为无效值(当然也可 展开全文
头像 牛客题解官
发表于 2022-04-22 12:10:38
精华题解 题目主要信息: 序列化二叉树即找一种顺序存储二叉树的节点,并以相同的方式能够读取序列重新构建。 换种说法,就是遍历二叉树,记录每个节点,再以同样的方式遍历就可以还原二叉树。 遍历的方法有四种:前序遍历、中序遍历、后序遍历、层次遍历,理论上只要以相同的方式序列化或者反序列化,都可以解题。 举一反三 展开全文
头像 幸福的火龙果在干饭
发表于 2021-07-14 15:54:45
精华题解 一、题目描述 JZ61序列化二叉树题目描述:请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可 展开全文
头像 zero201910022250376
发表于 2020-01-01 22:38:32
解题思路 序列化二叉树 递归遍历二叉树的节点,空节点使用#代替,节点之间使用逗号隔开,返回字符串 反序列化二叉树 设置序号index,将字符串根据逗号分割为数组,根据index的值来设置树节点的val,如果节点的值为#,则返回空的树节点。 public class SerializeTree { 展开全文
头像 AaroninMind
发表于 2020-02-09 15:25:55
序列化与反序列化二叉树 题目要求很明确: 使用!来分割值value,使用#来代替null值 根据题意:(采用的是前序遍历,中左右) 1 2 34 5 6 7序列化之后的结果为:1!2!4!#!#!5!#!#!3!6!#!#!7!#!#! 序列化很简单,只需要在遇到null的时候添加 展开全文
头像 牛客题解官
发表于 2020-06-02 10:56:39
#描述 这是一篇针对初学者的题解,共用两种方法解决。 知识点:二叉树,先序遍历,层次遍历 难度:二星 #题解 题目描述:给定一颗二叉树,将其序列化和反序列化。 ##方法一:先序遍历实现 预备知识:先序遍历的递归实现: void pre_order(TreeNode *root) { if (!r 展开全文
头像 牛客180548016号
发表于 2020-03-29 18:48:05
1.采用层次遍历虽然易于人观察,但代码实现起来麻烦,本次借鉴leetcode官方题解,采用先序遍历实现序列化与反序列化。2.先序遍历的按 root -> left subtree -> right subtree(根左右)的顺序递归进行,例如下面这幅图注意:按牛客网的格式,结果应为 "1 展开全文
头像 一叶浮尘
发表于 2020-03-05 11:25:51
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点( 展开全文
头像 greatOfferPlus
发表于 2022-04-04 21:38:05
最简单的python解题,怎么遍历放入就怎么反序列回去,无关是前序遍历还是层次遍历,此处我使用的是先序遍历 class Solution: str1 = [] def Serialize(self, root): # write code here i 展开全文
头像 法拉利201903231900848
发表于 2019-08-07 01:07:26
/*请实现两个函数,分别用来序列化和反序列化二叉树*/ /* struct TreeNode {     int val;     struct TreeNode *left;     struct TreeNode *right; 展开全文
头像 头都大了
发表于 2020-02-06 22:20:26
//递归方法(前序) public class Solution { //String str = ""; private int index = -1; String Serialize(TreeNode root) { if(root == null){ 展开全文
头像 不会做题的小菜鸡
发表于 2021-10-13 00:25:07
思路 题目分析 题目给出我们一棵树,要求我们实现两个函数 第一个函数要求我们以任意遍历方式返回一个字符串 第二个函数要求我们可以从上一个字符串中重新返回这棵树 方法一:递归 我们采用前序遍历的方式构造字符串并恢复树 序列化过程 递归函数退出条件是当节点为空,则返回"#"。我们一定要用 展开全文
头像 何人听我楚狂声的小迷弟
发表于 2020-04-22 17:30:37
(1) 先序遍历构造字符串(2) 确定一个数组下标根据字符串按序还原树结构 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : 展开全文