难点在于字符串解析和重建二叉树
序列化二叉树
https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: string req; char* Serialize(TreeNode *root) { if(root == nullptr) return nullptr;// 如果根节点为空就返回空指针 queue<TreeNode *> q; if(root != nullptr) q.push(root); while(!q.empty()) { TreeNode *front = q.front(); q.pop(); if(front) req += to_string(front->val) + ",";// 一个值对应"val," else req += "#,";// 空节点用'#'代替 if(front)// 全部插入,最后一定有后缀'#' { q.push(front->left); q.push(front->right); } } cout << req << endl;// 打印测试一下 return &req[0]; } TreeNode* Deserialize(char *str) { if(str == nullptr) return nullptr;// 如果字符串为空,那还反序列坤毛 string res(str); queue<TreeNode *> q; int left = 0,right = 0;// 双指针算法来了... /*-----------这里是反序列化的关键----------*/ right = res.find(",",left); if(right == string::npos) return nullptr;// 没找到任何逗号(不可能发生) string root_val = res.substr(left,right-left); ++right; left = right; cout << root_val << endl; if(root_val == "#") return nullptr;// 开头就是空,别玩了 /*-----------这里是反序列化的关键----------*/ TreeNode *root = new TreeNode(std::atoi(root_val.c_str()));// 根节点 q.push(root); while(!q.empty() && right < res.size()) { TreeNode *front = q.front(); q.pop(); if(right < res.size()) { right = res.find(",",left); if(right == string::npos) return nullptr;// 没找到任何逗号(不可能发生) string root_val = res.substr(left,right-left); ++right; left = right; cout << root_val << endl; if(root_val != "#") { front->left = new TreeNode(std::atoi(root_val.c_str())); q.push(front->left); } } if(right < res.size()) { right = res.find(",",left); if(right == string::npos) return nullptr;// 没找到任何逗号(不可能发生) string root_val = res.substr(left,right-left); ++right; left = right; cout << root_val << endl; if(root_val != "#") { front->right = new TreeNode(std::atoi(root_val.c_str())); q.push(front->right); } } } return root; } };