题解 | #序列化二叉树#
序列化二叉树
http://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84
序列化:前序遍历,将遍历结果保存在string中。 逆序列化,将序列化得到的string输出到流stringstream中,利用流不断的输出,递归建立二叉树,逆序列化同样是一个前序的过程,创建当前结点,并且创建当前结点的左右子结点,再递归创建当前结点的左子树和右子树,若当前结点为空则返回。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
void pre_order(TreeNode* root,string& result){
if(root==nullptr){
result+="#";
result+=" ";
return;
}
result+=to_string(root->val);
result+=" ";
pre_order(root->left,result);
pre_order(root->right,result);
}
string pre_str{};
char* Serialize(TreeNode *root) {
string result{};
pre_order(root,result);
pre_str=result;
return nullptr;
}
void re_build(stringstream& s_stream,TreeNode** root){
string temp{};
if(s_stream>>temp){
if(temp!="#"){
int value{};
stringstream s_strm{};
s_strm<<temp;
s_strm>>value;
*root=new TreeNode{value};
(*root)->val=value;
(*root)->left=nullptr;
(*root)->right=nullptr;
re_build(s_stream, &((*root)->left));
re_build(s_stream, &((*root)->right));
}
}
}
TreeNode* Deserialize(char* str) {
stringstream s_stream{};
s_stream<<pre_str;
cout<<pre_str;
TreeNode* new_root=nullptr;
re_build(s_stream, &new_root);
return new_root;
}
};