剑指offer(37

剑指offer(37)

剑指 Offer 37. 序列化二叉树

难度困难297

请实现两个函数,分别用来序列化和反序列化二叉树。

你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

示例:

img

输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]

思路:

​ 序列化与反序列化二叉树,难点在于对字符串的处理,建议每完成一项处理都进行测试。

class Codec {
public:
    string res="";
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        seria(root);//序列化根节点
        return res;
    }
    void seria(TreeNode* root){
        //如果节点为null,则在字符串中表示为#
        if(root==NULL){
            res+='#';
            return ;
        }
        //在每个节点值后面要加上','号来区分每个节点
        res+=to_string(root->val)+',';
        //前序遍历
        seria(root->left);
        seria(root->right);
    }
    vector<int>memo;
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        //cout<<data<<endl;
        //将序列化数据放入vector容器中
        string temp="";
        for(int i=0;i<data.length();i++){
            //如果搜索到#则表明该路径已经到底,注意数组中要放入不会与节点值重复的数字,否则会影响反序列化
            if(data[i]=='#'){
                memo.push_back(INT_MAX);
            }
            else if(data[i]==','){  
                //搜索到,号,说明一个结点值在这里结束,将temp的string类型转为int类型 使用aoti(temp.c_str());
                memo.push_back(atoi(temp.c_str()));
                temp="";
                //cout<<stoi(temp)<<endl;
            }
            else{
                temp+=data[i];
            }
            //cout<<temp<<endl;
        }
        //for(int a:memo){
        //    cout<<a<<endl;
        //}
        return deseria(memo);
    }
    TreeNode* deseria( vector<int>&memo){
        //for(int a:memo){
        //    cout<<a<<endl;
        //}
        if(memo.empty())return nullptr;
        if(memo.front()==INT_MAX){
            //如果搜索到#对应的值则删去容器头节点,同时返回nullptr
            memo.erase(memo.begin());
            return nullptr;
        }
        //每次取出头节点的值来构造,要记得删除头节点
        TreeNode* root=new TreeNode(memo.front());
        memo.erase(memo.begin());
        root->left=deseria(memo);
        root->right=deseria(memo);
        return root;
    }
};

posted @ 2022-05-02 10:09  BailanZ  阅读(20)  评论(0编辑  收藏  举报