题目

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

示例: 

你可以将以下二叉树:

    1
/ \
2 3
/ \
4 5 序列化为 "[1,2,3,null,null,4,5]"

提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。


Tag

IO库,stringstream的读取。

两个方法:stringstream in(str) :string往流里存。in.str() 从流返回string。 dfs。string -> int :stoi(val)。


法1.

1.序列化:dfs前中后、bfs层次。反序列化要和序列化方法对应,结果唯一。

2.空节点:‘#’

3.每个节点结束标志:‘ ’,作用是防止歧义

4.用std的string流来对string进行分割,in>>val;每次遇到空格就停止,流的状态改变。

//dfs:preOrder
class Codec {
public: // Encodes a tree to a single string.
string serialize(TreeNode* root) {
ostringstream out;
serialize(root,out);
return out.str();
} // Decodes your encoded data to tree.
TreeNode* deserialize(string data)
{
istringstream in(data);
return deserialize(in);
} private:
// root - left - right
void serialize(TreeNode *root,ostringstream &out)
{
if(root)
{
out<<root->val<<' ';//‘ ’为结束符
serialize(root->left,out);
serialize(root->right,out);
}
else
{
out<<"# ";//#代表空节点,后面还有一个结束符' '
}
} TreeNode* deserialize(istringstream &in)
{
string val;
in >> val; //一个单词作为独立元素。用string流把string分割了
if(val=="#")
return nullptr;
TreeNode* root=new TreeNode(stoi(val));
root->left=deserialize(in);
root->right=deserialize(in);
return root;
}
};

法2.BFS.队列。根节点入queue。检查根不为空。将根的左右节点入queue。

//BFS
class Codec {
public: // Encodes a tree to a single string.
string serialize(TreeNode* root) { if(!root)
return ""; queue<TreeNode*> q;
q.push(root);
stringstream out;//string 流,初始化接受string定义,int输入用<< while(!q.empty())
{
TreeNode* t = q.front();
q.pop();
if(t)//bfs如果根节点存在,把左右孩子依次压入队列
{
out<< t->val <<" ";
q.push(t->left);
q.push(t->right);
}
else
{
out<<"# ";
}
}
cout<<out.str();
return out.str();
} // Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if(data=="")
return nullptr;
queue<TreeNode*> myque;
stringstream in(data);
string val;
in>>val;
//第一个单词一定存在,压入队列,且是根节点
TreeNode* root=new TreeNode(stoi(val));
TreeNode* cur=root;
myque.push(root); while(!myque.empty())
{
cur=myque.front();myque.pop();
in>>val;
if(val!="#")
{
cur->left=new TreeNode(stoi(val));
myque.push(cur->left);
} in>>val;
if(val!="#")
{
cur->right=new TreeNode(stoi(val));
myque.push(cur->right);
} }
return root;
}
};

法3 返回char* 的做法。 strdup(out.str().c_str()); 将string 转为char *. 反之可以直接转换。

//bfs
#include <string.h>
class Solution {
public:
char* Serialize(TreeNode *root) {
if(!root)
return nullptr;
stringstream out;
queue<TreeNode*> myque;
myque.push(root); while(!myque.empty())
{
root=myque.front();myque.pop();
if(root)
{
out<<root->val<<" ";
myque.push(root->left);
myque.push(root->right);
}
else
{
out<<"# ";
}
}
return strdup(out.str().c_str());
} TreeNode* Deserialize(char *str) {
if(!str)
return nullptr;
string s=str;
stringstream in(s);
queue<TreeNode*> myque;
string val;
in>>val;
TreeNode* ret = new TreeNode(stoi(val));
TreeNode* root =ret;
myque.push(root);
while(!myque.empty())
{
root= myque.front();
myque.pop();
in>>val;
if(val!="#")
{
root->left = new TreeNode(stoi(val));
myque.push(root->left);
}
in>>val;
if(val!="#")
{
root->right = new TreeNode(stoi(val));
myque.push(root->right);
}
}
return ret;
}
};

问题

1.atoi/stoi/strtoi/stoui区别

2.C++ IO库

3.string 转 char*

头文件:#include <string.h>

定义函数:char * strdup(const char *s);

函数说明:strdup()会先用maolloc()配置与参数s 字符串相同的空间大小,然后将参数s 字符串的内容复制到该内存地址,然后把该地址返回。该地址最后可以利用free()来释放。

返回值:返回一字符串指针,该指针指向复制后的新字符串地址。若返回NULL 表示内存不足。

#include <string.h>
main(){
    char a[] = "strdup";
    char *b;
    b = strdup(a);
    printf("b[]=\"%s\"\n", b);
}

LeetCode297. Serialize and Deserialize Binary Tree的更多相关文章

  1. [LeetCode] Serialize and Deserialize Binary Tree

    Serialize and Deserialize Binary Tree Serialization is the process of converting a data structure or ...

  2. [LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

    描述 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉 ...

  3. LC 297 Serialize and Deserialize Binary Tree

    问题: Serialize and Deserialize Binary Tree 描述: Serialization is the process of converting a data stru ...

  4. 【LeetCode】297. Serialize and Deserialize Binary Tree 解题报告(Python)

    [LeetCode]297. Serialize and Deserialize Binary Tree 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode ...

  5. [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 ...

  6. [LeetCode] Serialize and Deserialize Binary Tree 二叉树的序列化和去序列化

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  7. LeetCode——Serialize and Deserialize Binary Tree

    Description: Serialization is the process of converting a data structure or object into a sequence o ...

  8. Serialize and Deserialize Binary Tree

    Design an algorithm and write code to serialize and deserialize a binary tree. Writing the tree to a ...

  9. 297. Serialize and Deserialize Binary Tree

    题目: Serialization is the process of converting a data structure or object into a sequence of bits so ...

随机推荐

  1. matlab 图像和 opencv 图像的相互转换

    matlab可以生成C++代码, 但是在涉及图像数据的时候,要注意数据格式的转换. 1. Matlab图像数据在内存中的存放顺序是R通道图,G通道图,B通道图.对于每个通道,数据存放是先列后行. 2. ...

  2. (转)python 集合,列表,元组,字符串,文件等操作总结

    原文:http://www.cnblogs.com/songqingbo/tag/python%E5%87%BD%E6%95%B0/

  3. Kure讲HTML_如何学习HTML

    HTML即是超文本标记语言,它主要是用来构建网页的轮廓的.HTML自身包含了众多的API(应用程序接口:即HTML暴露给Web前端开发者的语言特性,当然作为开发者就应该更多的关注这个.)话不多说,直接 ...

  4. Java方法-对指定信息基于相关维度进行分组

    近期项目中需要针对多种不同来源指定的相同类型内容进行合并,实现过程中需要根据指定的相关维度,对资源内容进行分组,如识别是否可以为同一人员信息,是否为同一个歌曲或影视信息,因此针对实现的具体细节做如下备 ...

  5. 二维码项目实例为二维码添加logo

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. Oracle错误——ORA-03113:通信通道的文件结尾

    请参考:http://blog.csdn.net/zwk626542417/article/details/39667999 今天跟往常一样,登陆PL/SQL,确登陆失败,出现一个错误“ORA-010 ...

  7. td标签里内容不换行

    在一些页面开发中,除自己操作外,引起换行的情况一般有: Ex一.td标签里内容长度过长引起换行: Ex二.div标签(或其他标记)里内容有文本和图片引起换行: 解决方法: 针对例子一用<nobr ...

  8. python随笔--根据号码查询归属地

    给定一组(串)数据,根据输入得号码,查询归属地 def num_info(num): info0 = """5583|1860100|010|北京市|北京联通GSM卡 5 ...

  9. <Android 基础(七)> DrawerLayout and NavigationView

    介绍 DrawerLayout是Support Library包中实现了侧滑菜单效果的控件 android.support.v4.widget.DrawerLayout NavigationView是 ...

  10. 树checkbox选择jquery实例

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...