297. 二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例 1:
输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
输入:root = [1,2]
输出:[1,2]
提示:
树中结点数在范围 [0, 104] 内
-1000 <= Node.val <= 1000
题解:
前序遍历序列化,然后前序遍历造树即可
vector加引用,不然会超时。。。。
/** * 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: void dfs(TreeNode* &root, vector<string> &vec) { if(root == NULL) { vec.push_back("null"); return; } vec.push_back(to_string(root->val)); dfs(root->left, vec); dfs(root->right, vec); } // Encodes a tree to a single string. string serialize(TreeNode* root) { vector<string> vec; dfs(root, vec); string ret = ""; for(int i = 0; i < vec.size(); i++) { if(i == 0) ret += vec[i]; else ret += " " + vec[i]; } return ret; } int to_int(string str) { int ret = 0, i = 0, flag = 0; if(str[0] == '-') flag = 1, i++; for(; i < str.size(); i++) { ret *= 10; ret += str[i] - '0'; } return flag ? -ret : ret; } void build(TreeNode* &root, vector<string> &vec, int &k) { // if(k >= 300) // cout << k << " "; if(k >= vec.size()) { return; } if(vec[k] == "null") { root = NULL; k++; return; } root = (TreeNode *) malloc(sizeof(TreeNode)); root->val = to_int(vec[k++]); build(root->left, vec, k); build(root->right, vec, k); } // Decodes your encoded data to tree. TreeNode* deserialize(string data) { vector<string> vec; int j = 0; while(j < data.size()) { string tmp = ""; while(j < data.size() && data[j] != ' ') tmp += data[j++]; vec.push_back(tmp); j++; } TreeNode* root = NULL; int k = 0; build(root, vec, k); return root; } }; // Your Codec object will be instantiated and called as such: // Codec ser, deser; // TreeNode* ans = deser.deserialize(ser.serialize(root));
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了