题目:
题解:
- 使用
先序遍历(根左右)实现二叉树的序列化和反序列化
,这里我们使用stringstream来存放字符串,因为这样可实现字符串的快速在尾部添加,以及反序列化时默认使用空格分割字符串。
代码如下:
class Codec {
public:
TreeNode *node;
// Encodes a tree to a single string.
//题解:使用先序遍历实现二叉树的序列化和反序列化,
//这里我们使用stringstream来存放字符串,因为这样可实现字符串的快速在尾部添加,以及反序列化时默认使用空格分割字符串
string serialize(TreeNode* root){
if(!root)return "";
stringstream ss;
preSerialize(root,ss);
return ss.str();
}
//前序遍历生成字符串
void preSerialize(TreeNode* root,stringstream& ss){
//1、递归边界:到达空节点,添加#
if(!root){
ss<<"# ";
return;
}
//2、递归表示式:添加节点值及空格
ss<<to_string(root->val)<<" ";
//3、缩小问题规模:递归添加左右子树的节点值
preSerialize(root->left,ss);
preSerialize(root->right,ss);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if(data.empty())return nullptr;
TreeNode* root=nullptr;
stringstream ss(data);
reBulid(root,ss);
return root;
}
//注意这里的形参为指针的引用,也就是引用绑定的对象是指针(指针是对象,所以可以有引用)
//这就是说这里我们传的是指针的引用(形参为引用来改变绑定对象的值),从而来添加左右子树
void reBulid(TreeNode* &root,stringstream& ss){
string t;
ss>>t;
//1、递归边界:到达空节点,将空节点添加到root中
if(t[0]=='#'){
root=nullptr;
return;
}
//2、递归表示式:建立根节点的值
root=new TreeNode(stoi(t));
//3、缩小问题规模:建立左右子树
reBulid(root->left,ss);
reBulid(root->right,ss);
}
};