问题描述

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

示例: 

你可以将以下二叉树:

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

代码

这种方法使用了二叉树的层序遍历,第二部分相当于把一个层序遍历的数组重新转化为一个二叉树,构造一个虚拟的节点ans,ans->right指向根节点,也就是要返回的答案,使用left来判断应该添加在根节点的哪一个子节点上。

/**
* 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 ans;
if(!root)return ans;
queue<TreeNode*> q;
TreeNode * node;
int size;
q.push(root);
while(!q.empty())
{
size = q.size();
for(int i = 0; i < size; ++i)
{
node = q.front();
q.pop();
if(node){
ans += to_string(node->val) + ',';
q.push(node->left);
q.push(node->right);
}
else{
ans += "null,";
}
}
}
if(!ans.size())ans.pop_back();
return ans;
} // Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
unique_ptr<TreeNode> ans(new TreeNode(0));
queue<TreeNode*> q;
q.push(ans.get());
int beg = 0,end = 0;
string s;
bool left = false;
while(beg < data.size())
{
while(end < data.size() && data[end] != ',')++end;
s = data.substr(beg,end-beg);
TreeNode* t = NULL;
if(s != "null")t = new TreeNode(atoi(s.c_str()));
auto cur = q.front();
if(left){
cur->left = t;
}
else{
cur->right = t;
q.pop();//添加完当前节点的右子节点后可以考虑队列中其他节点了
}
if(t)q.push(t);
left = !left;
beg = ++end;
}
return ans->right;
}
}; // Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));

结果

执行用时 :72 ms, 在所有 C++ 提交中击败了43.30%的用户
内存消耗 :29.7 MB, 在所有 C++ 提交中击败了100.00%的用户

也可以使用递归的方法来求解。

最新文章

  1. UVA 10245 - The Closest Pair Problem
  2. JDK下sun.net.www.protocol.http.HttpURLConnection类-----Http客户端实现类的实现分析
  3. MVC+MEF+UnitOfWork+EF架构,网站速度慢的原因总结!(附加ANTS Memory Profiler简单用法)
  4. Swift—final关键字-b
  5. 301跳转:IIS服务器网站整站301永久重定向设置方法(阿里云)
  6. python非转基因HTTP请求库--Requests: 让 HTTP 服务人类
  7. 关于js中 toFixed()的一个小坑
  8. 敏捷冲刺每日报告四(Java-Team)
  9. MacTalk&#183;人生元编程 - 读书笔记
  10. 探索 | “中医+AI”会诊电力设备故障
  11. Codeforces Round #487 (Div. 2) E. A Trance of Nightfall (矩阵优化)
  12. Linux学习笔记--vim
  13. MySQL自定义函数和存储过程的区别:
  14. [零基础学JAVA]Java SE面向对象部分.面向对象基础(04)
  15. lintcode-445-余弦相似度
  16. iOS面试题--网络--如何处理多个网络请求的并发的情况
  17. 剑指offer面试题1---赋值运算符函数
  18. 学习web安全之--初识安全
  19. 深入理解Spring MVC(山东数漫江湖)
  20. android实现超酷的腾讯视频首页和垂直水平网格瀑布流一揽子效果

热门文章

  1. odoo views中html的奇怪问题
  2. CF1547A Shortest Path with Obstacle 题解
  3. Django的Form表单验证
  4. WebSocket协议理解-数据包格式解析
  5. Linux使用docker部署nacos
  6. maven中pom文件中scope的作用
  7. 【LeetCode】919. Complete Binary Tree Inserter 解题报告(Python & C++)
  8. 【LeetCode】611. Valid Triangle Number 解题报告(Python)
  9. 小试国产开源HTAP分布式NewSQL数据库TiDB-v5.3.0
  10. &lt;学习opencv&gt;过滤器和卷积