题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
思路:这里序列化就是直接先序遍历即可,但是反序列化指输入序列,返回tree,这里由于左右子树位置不知道,所以在序列化的时候加入“#”字符,以此判断子树为空。
注:这里需要使用char*转string,string转char*,string转int,分别为
char*转string | 直接赋值即可 |
string转char* | c_str()方法,直接利用strcpy把转化的char*传入 |
string转int | stoi()函数,stoi()函数如果传入的字符串s中含有不是数字的字符,则只会识别到从开头到第一个非法字符之前,如果第一个字符就是非法字符则会报错 |
其中,我们在寻找逗号位置时,可以直接使用string中find_first_of(),即在指定字符串中查找第一个任意匹配字符的位置下标
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
void dfs1(TreeNode *root,string & ans)
{
if(root != NULL)
{
ans += to_string(root->val);
ans.push_back(',');
dfs1(root->left,ans);
dfs1(root->right,ans);
}
else
{
ans.push_back('#');
ans.push_back(',');
}
}
char* Serialize(TreeNode *root) {
if (root == NULL)
return NULL;
string str;
dfs1(root,str);
char *m = new char[str.length() + 1];
strcpy(m, str.c_str());
return m;
}
TreeNode* dfs2(string &ans)
{
if(ans.empty())
return NULL;
if (ans[0] == '#')
{
ans = ans.substr(2);//返回第二位以后的数
return NULL;
}
int count = 0;//判断几位数
while(count <= ans.length())
{
if(ans[count] == ',')
break;
count++;
}
//ans = ans.substr(ans.find_first_of(',') + 1);//直接寻找,位置
TreeNode* root = new TreeNode(stoi(ans));//stoi返回数字,遇到逗号会直接返回
ans = ans.substr(count+1);
root->left = dfs2(ans);
root->right = dfs2(ans);
return root;
}
TreeNode* Deserialize(char *str) {
if (str == NULL)
return NULL;
string ans(str);
return dfs2(ans);
}
};