保研机试之【二叉树序列化】

老规矩咯: 

参考:东哥带你刷二叉树(序列化篇) | labuladong 的算法笔记

建议先过一遍:今天是二叉树~-CSDN博客,very重要!

然后再过一遍(理解怎么应用方法):保研机试之[三道二叉树习题,思路为主]-CSDN博客

然后再过一遍(了解后序思路) :保研机试之【构造二叉树】-CSDN博客

来到今天的小剧场:297. 二叉树的序列化与反序列化 - 力扣(LeetCode)

序列化是指将一棵二叉树转变为一个序列(节点值+空指针表示(#)),我们又可以通过该序列转变回二叉树

中序遍历特殊情况:

我们用前序遍历和层次遍历的思路来解决这道题:
前序遍历:(也不算难吧,就是有很多细节要处理)

/**
 * 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 res="";
    void ser(TreeNode* root){
        if(root==nullptr){
            res+="#,";
            return;
        }
        //前
        res+=to_string(root->val);
        res+=",";
        ser(root->left);
        //中
        ser(root->right);
        //后
    }
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        ser(root);
        cout<<res<<endl;
        return res;
    }

    vector<string> temp;
    void deal(string data){
        stringstream ss(data);
        string item;
        while(getline(ss,item,',')){
            temp.push_back(item);
        }
    }
    int cnt=0;
    TreeNode* des(int len){
        //前
        if(temp[cnt]=="#"){cnt++;return nullptr;}
        TreeNode* node=new TreeNode;
        node->val=stoi(temp[cnt++]);
        TreeNode* left=des(len);
        //中
        TreeNode* right=des(len);
        //后
        node->left=left;
        node->right=right;
        return node;
    }
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        deal(data);
        int len=temp.size();
        TreeNode* result=des(len);
        return result;
    }
};

// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans = deser.deserialize(ser.serialize(root));

层次遍历: 字符串转二叉树的时候,将二叉树结点入队(包括空指针),再设置一个idx用于记录当下遍历到的二叉树结点的左右孩子的位置;每当pop一个二叉树结点时,就要给他分配左右孩子,并且将左右孩子入队。

/**
 * 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 res="";
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        TreeNode* head=root;
        if(root==nullptr){res+="#,";return res;}
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()){
            TreeNode* temp=q.front();
            if(temp==nullptr){res+="#,";q.pop();continue;}
            else{res+=to_string(temp->val);res+=",";}
            q.pop();
            q.push(temp->left);
            q.push(temp->right);
        }
        //cout<<res<<endl;
        return res;
    }
    vector<string> temp;
    void deal(string data){
        stringstream ss(data);
        string item;
        while(getline(ss,item,',')){
            temp.push_back(item);
        }
    }
    TreeNode* des(){
        int len=temp.size();
        if(len==1 && temp[0]=="#"){return nullptr;}
        TreeNode* root=new TreeNode;
        int idx=0;
        root->val=stoi(temp[idx++]);
        //cout<<root->val<<endl;
        queue<TreeNode*> q;
        q.push(root);
        for(int i=0;i<len;i++){
            TreeNode* t=q.front();
            q.pop();
            //cout<<q.size()<<endl;
            if(t==nullptr){continue;}

            if(temp[idx]=="#"){TreeNode* left=nullptr;idx++;q.push(left);t->left=left;}
            else{
                TreeNode* left=new TreeNode;
                left->val=stoi(temp[idx++]);
                q.push(left);
                t->left=left;
            }
            if(temp[idx]=="#"){TreeNode* right=nullptr;idx++;q.push(right);t->right=right;}
            else{
                TreeNode* right=new TreeNode;
                right->val=stoi(temp[idx++]);
                q.push(right);
                t->right=right;
            }
        }
        return root;
    }
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        deal(data);
        TreeNode* ans=des();
        return ans;
    }
};

// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans = deser.deserialize(ser.serialize(root));
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值