题解 | #序列化二叉树#

序列化二叉树

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;
    }
};




全部评论

相关推荐

我见java多妩媚:大外包
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务