297. 二叉树的序列化与反序列化 - 力扣(LeetCode) (leetcode-cn.com)
题意:给定二叉树,将各个结点值转化为字符串(包括中间的空结点,记为“None”);给定序列化字符串,转化为对应的二叉树。
注意:序列化时对树的遍历顺序,要与反序列化时建树的顺序保持一致。
反序列化:首先要按照逗号进行分割,分割为多个字符串,使用list进行存储,建树时每建好一个结点,则list去掉一个头元素。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Codec {
private:
//序列化:采用递归+先序
void serializeDFS(TreeNode* node, string& str) {
if(node == nullptr) {
str += "None,";
} else {
str += to_string(node->val) + ","; //中
serializeDFS(node->left, str); //左
serializeDFS(node->right, str);//右
}
}
//反序列化:建树的时候仍然是先序
TreeNode* deS(list<string>& dataArray) {
//如果是none
if(dataArray.front() == "None") {
//去除掉
dataArray.erase(dataArray.begin());
return nullptr;
}
TreeNode* root = new TreeNode(stoi(dataArray.front())); //中
dataArray.erase(dataArray.begin());
root->left = deS(dataArray); //左
root->right = deS(dataArray);//右
return root;
}
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
string str = "";
serializeDFS(root, str);
return str;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
list<string> dataArray;
string str;
//将序列按逗号切割
for(char c:data) {
if(c == ',') {
dataArray.push_back(str);
str.clear(); //清空
} else {
str += c;
}
}
//最后一个元素后面没有逗号,要单独操作
if(!str.empty()) {
dataArray.push_back(str);
str.clear();
}
return deS(dataArray);
}
};
// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans = deser.deserialize(ser.serialize(root));