序列化:用前序遍历,生成字符串。
反序列化:将字符串根据分隔符(逗号),切割成子字符串
需要注意的是,遍历时我们一般用void 返回值,将遍历值保存在数组中
,生成树时,一般用树节点作为返回值
//遍历的模板
void proess(TreeNode* root,vector<int>& my_vec)
{
if(root == nullptr)return ;
proess(root->left,my_vec);
my_vec.emplace_back(root->val);
proess(root->right,my_vec);
}
//生成树模板
TreeNode* preoss(vector<int>& nums,int left,int right){ //递归建立一个二叉树
if(right<left){ //base case;
return nullptr; //返回空
}
int mid = (right+left)/2;
TreeNode* head = new TreeNode(nums[mid]);
head->left = preoss(nums,left,mid-1); //根据递归规则,如果base case 不满足,这个节点就有值
head->right = preoss(nums,mid+1,right);
return head;
}
解答过程:
/**
* 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 {
public:
//序列化 //遍历的过程 使用前序遍历
string serialize(TreeNode* root) {
string my_str = "";
proess(root,my_str);
//my_str.pop_back();
//std::cout<<my_str<<std::endl;
return my_str;
}
//反序列化 //建树的过程
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
//queue<string> my_str;
vector<string> my_str;
vector<int> index;
for(int i = 0;i<data.size();i++)
{
if(data[i] == ',')index.emplace_back(i);
}
int first = 0;
for(int j = 0;j<index.size();j++){
string mid(data.begin()+first,data.begin()+index[j]);
my_str.push_back(mid);
//std::cout<<mid<<std::endl;
first = index[j]+1;
}
/*
for(auto i : my_str)
{
std::cout<<i<<std::endl;
}*/
int ind = 0;
return pro(my_str,ind);
}
TreeNode* pro(vector<string>& my_str,int& index) //建立一颗二叉树,返回树节点
{
if(my_str[index] == "null" || index>=(my_str.size()-1))
{
return nullptr;
}
TreeNode* head = new TreeNode(atoi(my_str[index].c_str()));
index++;
head->left = pro(my_str,index);
index++;
head->right = pro(my_str,index);
return head;
}
void proess(TreeNode* root, string& my_str)
{
if(root == nullptr)
{
my_str +="null,";
return ;
}
my_str += std::to_string(root->val); //转换成字符串的格式
my_str.push_back(',');
proess(root->left,my_str);
proess(root->right,my_str);
}
};
//2021.4.16
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));