2014-05-02 00:59
原题:
Given a normal binary tree, write a function to serialize the tree into a string representation (returning the string), and also a function to deserialize a serialized string into the original binary tree.
题目:给定一棵二叉树,请设计序列化和反序列化的方法。
解法:我的方法是使用前序遍历来进行序列化,其中大括号"{}"包含了数据序列,用“#”表示空指针。反序列化的思路则相反。
代码:
1 // http://www.careercup.com/question?id=5729456584916992 2 #include <cstdio> 3 #include <string> 4 #include <vector> 5 using namespace std; 6 7 struct TreeNode { 8 int val; 9 TreeNode *left; 10 TreeNode *right; 11 TreeNode(int _val = 0): val(_val), left(nullptr), right(nullptr) {}; 12 }; 13 14 class BinaryTreeSerializer { 15 public: 16 string serialize(TreeNode *root) { 17 string res = "{"; 18 19 // preorder traversal 20 serializeTraversal(root, res); 21 res[res.length() - 1] = '}'; 22 23 return res; 24 }; 25 26 TreeNode *deserialize(string s) { 27 vector<string> data; 28 int i, j, len; 29 30 len = (int)s.length(); 31 i = 1; 32 while (true) { 33 j = i + 1; 34 while (s[j] != ',' && s[j] != '}') { 35 ++j; 36 } 37 data.push_back(s.substr(i, j - i)); 38 i = j + 1; 39 if (i >= len) { 40 break; 41 } 42 } 43 44 int iter = 0; 45 TreeNode *root = nullptr; 46 47 // preorder traversal 48 deserializeTraversal(data, root, iter); 49 50 return root; 51 }; 52 private: 53 static char ss[10]; 54 55 void serializeTraversal(TreeNode *root, string &res) { 56 if (root == nullptr) { 57 res += "#,"; 58 } else { 59 sprintf(ss, "%d", root->val); 60 res += string(ss); 61 res.push_back(','); 62 serializeTraversal(root->left, res); 63 serializeTraversal(root->right, res); 64 } 65 }; 66 67 void deserializeTraversal(vector<string> &data, TreeNode *&root, int &iter) { 68 ++iter; 69 if (data[iter - 1] == "#") { 70 root = nullptr; 71 } else { 72 int val; 73 74 sscanf(data[iter - 1].c_str(), "%d", &val); 75 root = new TreeNode(val); 76 deserializeTraversal(data, root->left, iter); 77 deserializeTraversal(data, root->right, iter); 78 } 79 }; 80 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)