leetcode 297二叉树的序列化与反序列化
to_string(x) 将数字x转化为string
atoi(x) 将char转化为int
stoi(x) 将string 转化为int
采用中序遍历的顺序存储,NULL用#表示,以,分隔,O(n)time O(n) space
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/ /**
使用先序递归序列来进行序列化与反序列化
to_string转化为string以逗号分隔;递归终点x->val==NULL getline(s,str,',');每次读取','之前的字符串;递归终点str=="#"
**/
class Codec {
public: // Encodes a tree to a single string.
string serialize(TreeNode* root) {
if(root==NULL)
return "#";
else
return to_string(root->val)+","+serialize(root->left)+","+serialize(root->right);
} // Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if(data=="#")
return NULL;
stringstream s(data);
return makedeserialize(s);
}
TreeNode* makedeserialize(stringstream&s){
string str;
getline(s,str,',');
if(str=="#")
return NULL; TreeNode* root=new TreeNode(stoi(str));
root->left=makedeserialize(s);
root->right=makedeserialize(s); return root;
}
}; // Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
采用层序遍历的顺序,储存每一层的值,不存在的或者NULL值用#代替,每个位置以'/'结束
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Codec {
public: // Encodes a tree to a single string.
string serialize(TreeNode* root) {
string res;
queue<TreeNode*> q;
q.push(root);
int flag=;
while(flag){
flag=;
int k=q.size();
for(int i=;i<k;i++){
TreeNode* p=q.front();
q.pop();
if(p==NULL){
res.push_back('#');
q.push(NULL);
q.push(NULL);
}else{
int value=p->val;
if(value<) {res.push_back('-');value=-value;}
stack<char> s;
if(value==) s.push('');
while(value){
int e=value%;
s.push(e+'');value=value/;
}
while(!s.empty()){
res.push_back(s.top());s.pop();
}
q.push(p->left);
q.push(p->right);
if(p->left||p->right) flag=;
}
res.push_back('/');
}
}
cout<<res<<endl;
return res;
} // Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if(data.size()==) return NULL;
if(data.size()==&&data[]=='#')return NULL;
int len=data.size();
vector<TreeNode*> v;
for(int i=;i<len;i++){
if(data[i]=='/')continue;
TreeNode* p=NULL; if(data[i]!='#'){
int value=;
int flag=;
if(data[i]=='-') {flag=-;i++;}
while(data[i]!='/'){
value=*value+data[i]-'';
i++;
}
value=flag*value;
p=new TreeNode(value);
} v.push_back(p);
}
for(int i=;i<(v.size()-)/;i++){
if(v[i]!=NULL){
v[i]->left=v[*i+];
v[i]->right=v[*i+];
}
}
return v[];
}
}; // Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
测试例子如下:
样例通过为47/48,一个深度为1000的偏二叉树没有通过;
leetcode 297二叉树的序列化与反序列化的更多相关文章
- Java实现 LeetCode 297 二叉树的序列化与反序列化
297. 二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得 ...
- Leetcode 297.二叉树的序列化和反序列化
二叉树地序列化和反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. ...
- 【LeetCode】297. 二叉树的序列化与反序列化
297. 二叉树的序列化与反序列化 知识点:二叉树:递归 题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一 ...
- 297 Serialize and Deserialize Binary Tree 二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据.请设计一个算法来实现二叉树 ...
- [Java]LeetCode297. 二叉树的序列化与反序列化 | Serialize and Deserialize Binary Tree
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- lintcode : 二叉树的序列化和反序列化
题目 二叉树的序列化和反序列化 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制 ...
- 二叉树的序列化和反序列化(Java)
请实现两个函数,分别用来序列化和反序列化二叉树 序列化就是将二叉树以字符串输出,反序列化:根据自己输出的字符串,构建二叉树. 这里先序遍历输出,且为了方便反序列化,各个节点","隔 ...
- [LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)
描述 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉 ...
- [LeetCode] 297. Serialize and Deserialize Binary Tree 二叉树的序列化和反序列化
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
随机推荐
- Ubuntu 18.04 LTS 64位Linux搭建Kubernetes 1.15.3并join子节点的完整过程
1.软件准备 1.1.Ubuntu系统安装 https://ubuntu.com/download#download ubuntu系统需要设置用户,root默认为系统的账户不能被用户设置且每一次开机都 ...
- 织梦多个栏目arclist调用副栏目不显示的解决办法
织梦arclist调用副栏目不显示,网上关于这个问题的解决办法有很多,其中一种是: 打开/include/taglib/arclist.lib.php,代码约位于295-296行(我目前用的DedeC ...
- linux yum 安装及卸载
在Centos中yum安装和卸载软件的使用方法安装方法安装一个软件时yum -y install httpd安装多个相类似的软件时yum -y install httpd*安装多个非类似软件时yum ...
- springboot中使用servlet时返回结果乱码问题
在总的配置文件:application.properties中做一个配置,把我的问题解决了. #编码格式 spring.http.encoding.force=true spring.http.enc ...
- lightinthebox程序bug zencart
1.清空旧产品分类,新增分类与产品,前台首页不显示中间栏,提示无产品:布局设置 -(Main Page - Opens with Category)首页显示某分类,把新增的某分类ID填上或者设为0即可 ...
- 19.8.8 flutter 学习之创建第一个可变的Widget
创建一个很简单的可变的Widget 效果就是点击字的时候会变化 完整代码: class CarPage extends StatefulWidget { @override _CarState cre ...
- eclipse+自己安装的maven不能run as 找不到包
我本地环境eclipse自带maven但是默认指定的路径是c盘下,本着不想放c盘,就自己下了maven包集成到eclipse中,但是java类中main方法如果调用了maven中的包是找不到的.后类自 ...
- 2017 阿里巴巴 C++后台开发一面 3.14
下午4点接到一个杭州打过来的电话,阿里巴巴一面.持续时间半个小时. 面试官是阿里云KVStore组. 1.自我介绍,说一下项目 说了下之前在公司做的手绘几何图形规整输出的项目,提了下当时遇到的问题,以 ...
- C#使用BinaryReader类读取二进制文件
Close():关闭BinaryReader对象: Read():从指定流读取数据,并将指针迁移,指向下一个字符. ReadDecimal():从指定流读取一个十进制数值,并将在流中的位置向前 ...
- JAVA笔记10-抽象类
(1)abstrac关键字类修饰的类是抽象类,用abstract修饰的方法是抽象方法: (2)含有抽象方法的类必须被定义为抽象类: (3)抽象类必须被继承,抽象方法必须被重写(或者将子类也声明为抽象类 ...