一开始想复杂了,其实怎么拆分就怎么还原,也不需要按照每一层每一层这样记录下满二叉树。
用的层次遍历思想,但是不要分层去拆。
class Solution { public: // !作为每组数字的结尾,空节点用#表示 char* Serialize(TreeNode *root) { if (!root) { return nullptr; } std::string str; std::queue tree; tree.push(root); str += std::to_string(root->val) + '!'; while (!tree.empty()) { TreeNode *cur = tree.front(); tree.pop(); if (cur->left) { tree.push(cur->left); str += std::to_string(cur->left->val) + '!'; } else { str += '#'; } if (cur->right) { tree.push(cur->right); str += std::to_string(cur->right->val) + '!'; } else { str += '#'; } } char *res = new char[str.size() + 1]; std::strcpy(res, str.c_str()); return res; } TreeNode* Deserialize(char *str) { if (!str) { return nullptr; } std::string list = str; std::vector s; std::queue tree; int i = 0; while (i < list.size()) { if (list[i] == '#') { s.push_back(std::string("#")); ++i; continue; } int j = i; while (list[j] != '!') { ++j; } s.push_back(list.substr(i, j - i)); i = j + 1; } i = 1; TreeNode *root = new TreeNode(std::stoi(s[0])); tree.push(root); while (i < s.size()) { TreeNode *cur = tree.front(); tree.pop(); cur->left = cur->right = nullptr; if (s[i] != "#") { cur->left = new TreeNode(std::stoi(s[i])); tree.push(cur->left); } if (s[i+1] != "#") { cur->right = new TreeNode(std::stoi(s[i+1])); tree.push(cur->right); } i += 2; } return root; } };