本文共 1996 字,大约阅读时间需要 6 分钟。
序列化和反序列化是将树结构转换为字符串或其他数据结构的过程,常用于数据持久化或传输。以下是优化后的代码和解释:
思想:
逐层写入树节点的值,使用队列来维护当前处理的节点层次。每次从队列中取出当前节点,记录其值,然后将左、右子节点加入队列,继续处理。空节点记录为“NULL”。复杂度:
代码:
#include#include #include using namespace std;string serialize(TreeNode* root) { queue my_queue; my_queue.push(root); string str_tree; while (!my_queue.empty()) { TreeNode* cur = my_queue.front(); my_queue.pop(); if (cur != NULL) { str_tree += to_string(cur->val) + " "; my_queue.push(cur->left); my_queue.push(cur->right); } else { str_tree += "NULL "; } } return str_tree;}
思想:
将字符串拆分成单个节点值,并重建树结构。使用流来逐个读取字符,构建节点值列表。然后根据列表顺序重建树,连接左、右子节点。复杂度:
代码:
#include#include #include #include using namespace std;TreeNode* deserialize(string data) { if (data.empty()) { return NULL; } istringstream input(data); string str_cur; vector vec_node; while (input >> str_cur) { if (str_cur == "NULL") { vec_node.push_back(NULL); } else { vec_node.push_back(new TreeNode(stoi(str_cur))); } } for (int i = 0, j = 1; j < vec_node.size(); ++i) { if (vec_node[i] == NULL) { continue; } vec_node[i]->left = vec_node[j++]; if (j < vec_node.size()) { vec_node[i]->right = vec_node[j++]; } } return vec_node[0];}
注意:
ostringstream和istringstream来提高效率,避免频繁的字符串拼接。序列化:
ostringstream替代string的+操作,提升拼接效率。反序列化:
代码结构:
vector和queue等数据结构,优化空间复杂度。可逆性:
通过以上优化,代码结构清晰,效率提升,适用于大规模数据序列化和反序列化任务。
转载地址:http://mndq.baihongyu.com/