二叉树的序列化与反序列化
原题在这里:
概述:
给定一个二叉树的根节点,要求转换为任意字符串,后将该字符串还原二叉树的结构。
硬核手撸:

struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class Codec { int id; vector<int> tv(TreeNode *r)//node -> vector { /* 这里不便用递归法生成数组了, 用迭代法,但是只能用迭代法二 */ vector<int> ans; if (!r) return ans; stack<TreeNode *> st; TreeNode *n = r; while (!st.empty() || n != nullptr) { while (n != nullptr) { ans.emplace_back(n->val); st.emplace(n); n = n->left; } ans.emplace_back(-9999); n = st.top()->right; st.pop(); } return ans; } TreeNode *vt(vector<int> num)//vector -> node { //前序遍历构造 if (id >= num.size() || num[id] == -9999) return nullptr; TreeNode *r = new TreeNode(num[id]); ++id, r->left = vt(num); ++id, r->right = vt(num); return r; } vector<int> sv(string s)//string -> vector { vector<int> ans; int num = 0, pd = 1; for (char i : s) { if (i == ' ') ans.emplace_back(num * pd), num = 0, pd = 1; else if (i == '-') pd = -1; else num = num * 10 + (i - '0'); } return ans; } string is(int x)//int -> string { if (x == 0) return "0"; bool pd = false; string ans = ""; if (x < 0) pd = true, x = -x; while (x) ans = (char)(x % 10 + '0') + ans, x /= 10; return (pd ? "-" : "") + ans; } public: string serialize(TreeNode *root) { string ans = ""; vector<int> num = tv(root);//前序遍历转存为数组 for (int i : num) ans += is(i) + ' ';//格式化数组为字符串 return ans; } TreeNode *deserialize(string data) { id = 0; return vt(sv(data));//将字符串转换成数组后再还原为二叉树 } };
鉴于手撸AC了,就暂时不学习其他代码。
注意一点是,节点转存数组的时候:
不能使用下文的第一种迭代法
【在遇到如二叉树[1,2]的时候,遍历节点1,会考虑到右子树为空,导致生成数组为[1,null,2,null,null]】
只能使用第二种。
引文——二叉树的遍历。
【Over】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!