【LeetCode449】-序列化和反序列化二叉搜索树

解码和复原的思考:
其实只有前序的序列才可以实现,前序的情况第一个是根节点,所以才方便以此为开端建树
在这里插入图片描述在这里插入图片描述

实现思路

字符串转换为二叉树
(1)先将所有字符串按逗号分隔出整数
(2)再利用整数新new节点,将所有的节点都存储在vector中

可以发现题中给出的序列是前序遍历,也就是意味着第一个为根节点,遍历vector中除根节点以外的节点依次开始建树

二叉树转换为字符串
(1)实现将大于等于1位的整数转换为字符串
在这里插入图片描述

(2)转换之前先拼接[
(3)转换之后再拼接]
(4)中间过程记得除了第一位,都在前面加上,此过程可借助一个标志变量来控制

说明一点这种情况结束后,vector是释放掉没有了,但是new出来的树节点还在

实现代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Codec {
    
    
public:

    string int2string(int x){
    
    
        if(!x) return "0";
        string s="";
        while(x){
    
    
            s+=char('0'+x%10);
            x/=10;
        }
        reverse(s.begin(),s.end());
        return s;
    }
    // Encodes a tree to a single string.
    void get_string(TreeNode* root,string &s,bool &flag){
    
    
        if(!root){
    
    
            return;
        }
        if(flag){
    
    
            s+=",";
        }else{
    
    
            flag=true;
        }
        s+=int2string(root->val);

        get_string(root->left,s,flag);
        get_string(root->right,s,flag);
    }
    string serialize(TreeNode* root) {
    
    
        string s="[";
        bool begin=false;
        get_string(root,s,begin);
        s+="]";
        // cout<<s<<endl;
        return s;
    }

    void build_node(vector<TreeNode*> &a,string &s){
    
    
        
        int n=s.length()-2;
        if(!n){
    
    
            return ;      
        }
        int i=1;
        int t=0;
        while(i<n+1){
    
    
            if(isdigit(s[i])){
    
    
                t=t*10+s[i]-'0';
            }else{
    
    
                a.push_back(new TreeNode(t));
                t=0;
            }
            i++;
        }
        a.push_back(new TreeNode(t));
    }

    void build_tree(TreeNode* a,TreeNode *root){
    
    
        if(a->val<root->val){
    
    
            if(!root->left){
    
    
                root->left=a;
                return;
            }
            else{
    
    
                build_tree(a,root->left);
            }
        }
        else{
    
    
            if(!root->right){
    
    
                root->right=a;
                return;
            }
            else{
    
    
                build_tree(a,root->right);
            }
        }
    }
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
    
    
        vector<TreeNode*> a;
        build_node(a,data);
        // for(auto item:a){
    
    
        //     cout<<(item->val)<<endl;
        // }
        if(a.size()==0) return NULL;
        TreeNode *root=a[0];
        for(int i=1;i<a.size();i++)
            build_tree(a[i],root);
        return root;
    }
};

// Your Codec object will be instantiated and called as such:
// Codec* ser = new Codec();
// Codec* deser = new Codec();
// string tree = ser->serialize(root);
// TreeNode* ans = deser->deserialize(tree);
// return ans;

提交结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44944046/article/details/114643160