acwing 50. 序列化二叉树
地址 https://www.acwing.com/problem/content/46/
请实现两个函数,分别用来序列化和反序列化二叉树。
您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。
样例
你可以序列化如下的二叉树 8 / \ 12 2 / \ 6 4 为:"[8, 12, 2, null, null, 6, 4, null, null, null, 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 Solution { public: string str; // Encodes a tree to a single string. string serialize(TreeNode* root) { if (root == NULL) { if (!str.empty()) { str += ','; } str += "NULL"; return str; } if (!str.empty()) { str += ','; } str += to_string(root->val); serialize(root->left); serialize(root->right); //cout << "str = " << str<<endl; return str; } string ParseString( string& data, int& val) { string ret; if (data[0] == ',') { data = data.substr(1); } if (data.empty()) { // assert(0); val = -99999; return ""; } else if (data[0] == 'N') { val = -99999; ret = data.substr(4); } else if (data[0] >= '0' || data[0] <= '9') { int idx = 0; while (data[idx] != ',' && idx < data.size()) { idx++; } string numstr = data.substr(0, idx ); ret = data.substr(idx ); val = atoi(numstr.c_str()); } else { //assert(0); } if (ret[0] == ',') { ret = ret.substr(1); } return ret; } //8,12,NULL,NULL,2,6,NULL,NULL,4,NULL,NULL TreeNode* deserializeInner(string& data) { if (data.empty() || data == "NULL") return NULL; if (data[0] == ',') { data = data.substr(1); } int val = -99999; string nextStr = ParseString(data, val); data = nextStr; if (val == -99999) { return NULL; } TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); memset(root, 0, sizeof(TreeNode)); root->val = val; root->left = deserializeInner(data); root->right = deserializeInner(data); return root; } // Decodes your encoded data to tree. TreeNode* deserialize(string data) { if (data.empty() ||data == "NULL") return NULL; //cout << data<<endl; int val = -1; string nextStr = ParseString(data, val); TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); memset(root, 0, sizeof(TreeNode)); root->val = val; root->left = deserializeInner(nextStr); root->right = deserializeInner(nextStr); return root; } };
有点乱 待优化
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2017-08-15 随机发牌 代码
2017-08-15 网络传输 buf 封装 示例代码
2016-08-15 CMAKE 教程前两章节学习