《剑指offer》面试题37. 序列化二叉树
2024-10-19 18:44:16
问题描述
请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
你可以将以下二叉树:
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%的用户
也可以使用递归的方法来求解。
最新文章
- UVA 10245 - The Closest Pair Problem
- JDK下sun.net.www.protocol.http.HttpURLConnection类-----Http客户端实现类的实现分析
- MVC+MEF+UnitOfWork+EF架构,网站速度慢的原因总结!(附加ANTS Memory Profiler简单用法)
- Swift—final关键字-b
- 301跳转:IIS服务器网站整站301永久重定向设置方法(阿里云)
- python非转基因HTTP请求库--Requests: 让 HTTP 服务人类
- 关于js中 toFixed()的一个小坑
- 敏捷冲刺每日报告四(Java-Team)
- MacTalk&#183;人生元编程 - 读书笔记
- 探索 | “中医+AI”会诊电力设备故障
- Codeforces Round #487 (Div. 2) E. A Trance of Nightfall (矩阵优化)
- Linux学习笔记--vim
- MySQL自定义函数和存储过程的区别:
- [零基础学JAVA]Java SE面向对象部分.面向对象基础(04)
- lintcode-445-余弦相似度
- iOS面试题--网络--如何处理多个网络请求的并发的情况
- 剑指offer面试题1---赋值运算符函数
- 学习web安全之--初识安全
- 深入理解Spring MVC(山东数漫江湖)
- android实现超酷的腾讯视频首页和垂直水平网格瀑布流一揽子效果
热门文章
- odoo views中html的奇怪问题
- CF1547A Shortest Path with Obstacle 题解
- Django的Form表单验证
- WebSocket协议理解-数据包格式解析
- Linux使用docker部署nacos
- maven中pom文件中scope的作用
- 【LeetCode】919. Complete Binary Tree Inserter 解题报告(Python & C++)
- 【LeetCode】611. Valid Triangle Number 解题报告(Python)
- 小试国产开源HTAP分布式NewSQL数据库TiDB-v5.3.0
- <;学习opencv>;过滤器和卷积