60.序列化二叉树
题目内容:
代码及思路:
其中#表示的是nullptr,因此根据这个特点,反序列化为二叉树时,也是根据先根节点,后左右子树的顺序。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
};
class Solution {
public:
void buildTree(TreeNode** root)
{
int temp;
cin >> temp;
if (temp == 0)
{
(*root)->val = 0;
(*root) = nullptr;
return;
}
else
{
(*root)->val = temp;
(*root)->left = new TreeNode();
buildTree(&(*root)->left);
(*root)->right = new TreeNode();
buildTree(&(*root)->right);
}
}
char* Serialize(TreeNode* root) //前序遍历从根节点开始,然后依次是左子树与右子树
{
if (!root)
return "#,";
string str = to_string(root->val);
str.push_back(',');
char* left = Serialize(root->left);
char* right = Serialize(root->right);
char* res = new char[strlen(left) + strlen(right) + str.size()];
strcpy(res, str.c_str()); //从根节点开始复制
strcat(res, left);
strcat(res, right);
return res;
}
TreeNode* Deserialize(char* str)
{
return deserialize(str);
}
TreeNode* deserialize(char* &str)
{
if (*str == '#')
{
str++;
return nullptr;
}
int num = 0;
while (*str != '\0'&&*str != ',')
{
num = num * 10 + (*(str++) - '0'); //将字符变为数字
}
TreeNode* pNode = new TreeNode();
pNode->val = num;
if (*str == '\0') //临界值要处理好
return pNode;
else
{
++str;
}
pNode->left = deserialize(str);
pNode->right = deserialize(str);
return pNode;
}
};
void main()
{
Solution* object = new Solution();
TreeNode* pNode = new TreeNode();
object->buildTree(&pNode);
char* str = object->Serialize(pNode);
int len = strlen(str);
str[len - 1] = '\0';
TreeNode* depNode = new TreeNode();
depNode = object->Deserialize(str);
}