1. 二叉树序列化与反序列化核心概念
二叉树序列化与反序列化是数据结构中一个经典问题,也是实际工程中常用的技术。简单来说,序列化就是把二叉树转换成字符串或字节流的过程,而反序列化则是将这个字符串或字节流重新构建成原始的二叉树结构。
这个技术在实际开发中有广泛应用场景:
- 网络传输:当需要在不同系统间传输二叉树结构时
- 持久化存储:将二叉树保存到文件或数据库中
- 进程间通信:在不同进程间传递复杂数据结构
注意:中序遍历序列无法唯一确定一棵二叉树,这是由其遍历特性决定的。这也是为什么我们通常选择前序或后序遍历来实现序列化的原因。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基于前序遍历的序列化实现
2.1 序列化核心逻辑
前序遍历序列化的核心思想是"根-左-右"的递归顺序。以下是C++实现的关键代码解析:
cpp复制void rserialize(TreeNode* root, string& str) {
if (root == nullptr) {
str += "None,"; // 空节点标记
} else {
str += to_string(root->val) + ","; // 当前节点值
rserialize(root->left, str); // 递归左子树
rserialize(root->right, str); // 递归右子树
}
}
这段代码的工作流程:
- 遇到空节点时,添加"None,"标记
- 非空节点则记录节点值并添加逗号分隔符
- 递归处理左右子树
2.2 序列化入口函数
cpp复制string serialize(TreeNode* root) {
string ret;
rserialize(root, ret);
return ret;
}
这个入口函数初始化空字符串,调用核心序列化函数,最终返回序列化结果。
3. 反序列化实现详解
3.1 字符串分割处理
反序列化首先需要将序列化字符串分割成节点列表:
cpp复制list<string> dataArray;
string tmp;
for (auto& ch : data) {
if (ch == ',') {
dataArray.push_back(tmp);
tmp.clear();
} else {
tmp.push_back(ch);
}
}
if (!tmp.empty()) {
dataArray.push_back(tmp);
}
这段代码遍历输入字符串,遇到逗号就将临时字符串存入列表,最后处理可能的剩余字符。
3.2 反序列化核心逻辑
cpp复制TreeNode* rdeserialize(list<string>& dataArray) {
if (dataArray.front() == "None") {
dataArray.erase(dataArray.begin());
return nullptr;
}
TreeNode* root = new TreeNode(stoi(dataArray.front()));
dataArray.erase(dataArray.begin());
root->left = rdeseria
