【二叉树专题】剑指 Offer 37. 序列化二叉树

本问题对应课程链接:剑指offer刷题第六期

要求:

1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度

共以下 18 个回答

  • YOLO 普通 2024年4月9日 下午9:53
     /*请实现两个函数,分别用来序列化和反序列化二叉树。 */
    public class Codec {
    
        // Encodes a tree to a single string.
        public String serialize(TreeNode root) {
            if(root == null){
                return "";
            }
            //StringBuilder 的特性:利用append拼接八大类型的任一种类型,此时选择以字符串类型进行拼接
            StringBuilder build = new StringBuilder();
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
    
            while(!queue.isEmpty()){
               TreeNode t = queue.poll();
                if(t != null){
                    queue.add(t.left);
                    queue.add(t.right);
                    build.append(t.val + ",");
                }
                else{
                    build.append("null,");
                }
    
            }
            return build.toString();
    
        }
    
        // Decodes your encoded data to tree.
        public TreeNode deserialize(String data) {
            if(data == null || data.length() <= 0){
                return null;
            }
            String[] s = data.split(",");
            Queue<TreeNode> queue = new LinkedList<>();
            //将字符串的第一位先定义好,并入队列
            TreeNode root = new TreeNode(Integer.parseInt(s[0]));
            queue.add(root);
            int i = 1;
            while(!queue.isEmpty()){
                TreeNode t = queue.poll();
                //构建左子树
                if(!s[i].equals("null")){
                    TreeNode left = new TreeNode(Integer.parseInt(s[i]));
                    t.left = left;
                    queue.add(left);
                }
                i++;
                //构建右子树
                if(!s[i].equals("null")){
                    TreeNode right = new TreeNode(Integer.parseInt(s[i]));
                    t.right = right;
                    queue.add(right);
                }
                i++;
            }
            return root;
    
        }
    }
    时间:On,空间:On
    
    0 赞同 0 条回复
  • NULL 普通 2024年3月21日 下午2:13

    public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        // 序列化成字符串,1,2,3,null,null,4,5,null...
        if(root == null){
            return "";
        }
        StringBuilder build = new StringBuilder();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
    
        while(!queue.isEmpty()){
            TreeNode t = queue.poll();
            if(t != null){
                queue.add(t.left);
                queue.add(t.right);
                build.append(t.val + ",");
            }else{
                build.append("null,");
            }
        }
    
        return build.toString();
    }
    
    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        // 1,2,3,null,null,4,5,null...
        if(data == null || data.length() <= 0){
            return null;
        }
        String[] s = data.split(",");
        Queue<TreeNode> queue = new LinkedList<>();
        TreeNode root = new TreeNode(Integer.parseInt(s[0]));
        queue.add(root);
        int i = 1;
        while(!queue.isEmpty()){
            TreeNode t = queue.poll();
            // 构建做左节点
            if(!s[i].equals("null")){
                TreeNode left = new TreeNode(Integer.parseInt(s[i]));
                t.left = left;
                queue.add(left);
            }
            i++;
            // 构建右节点
            if(!s[i].equals("null")){
                TreeNode right = new TreeNode(Integer.parseInt(s[i]));
                t.right = right;
                queue.add(right);
            }
            i++;
        }
        return root;
    
    }
    

    }

    0 赞同 0 条回复
  • 紫芝 普通 2024年3月18日 下午12:17

    思路:使用队列+层序遍历

    “`c++
    class Codec {
    public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        if (root == nullptr) return "";
        string ans(to_string(root->val));
        queue<TreeNode*> que;
        que.push(root);
        while (!que.empty()) {
            int len = que.size();
            for (int i=0; i<len; i++) {
                TreeNode* cur = que.front();
                que.pop();
                if (cur->left) {
                    ans += "," + to_string(cur->left->val);
                    que.push(cur->left);
                } else {
                    ans += ",N";
                }
                if (cur->right) {
                    ans += ","+to_string(cur->right->val);
                    que.push(cur->right);
                } else {
                    ans += ",N";
                }
            }
        }
        return ans;
    }
    int transfer(string& data, int &start) {
        int prestart = start;
        while (start < data.size() && data[start] != ',') ++start;
        // skip ','
        ++start;
        return stoi(data.substr(prestart, start-prestart-1));
    }
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        if (data.size() == 0) return nullptr;
        queue<TreeNode*> que;
        int start = 0;
        TreeNode *root = new TreeNode(transfer(data, start));
        que.push(root);
        while (!que.empty()) {
            int len = que.size();
            for (int i=0; i<len; i++) {
                TreeNode *cur = que.front();
                que.pop();
                if (data[start] != 'N') {
                    cur->left = new TreeNode(transfer(data, start));
                    que.push(cur->left);
                } else {
                    // skip 'N,'
                    start += 2;
                }
                if (data[start] != 'N') {
                    cur->right = new TreeNode(transfer(data, start));
                    que.push(cur->right);
                } else {
                    start += 2;
                }
            }
        }
        return root;
    }
    

    };

    “`

    0 赞同 0 条回复
  • Raphtalia. 普通 2024年3月15日 下午2:47

    class Codec {
    public:
    void rserialize(TreeNode* root, string& str) {
    if (root nullptr) {
    str += “None,”;
    } else {
    str += to_string(root->val) + “,”;
    rserialize(root->left, str);
    rserialize(root->right, str);
    }
    }

    string serialize(TreeNode* root) {
        string ret;
        rserialize(root, ret);
        return ret;
    }
    
    TreeNode* rdeserialize(list<string>& dataArray) {
        if (dataArray.front() == "None") {
            dataArray.erase(dataArray.begin());
            return nullptr;
        }
    
        TreeNode* root = new TreeNode(stoi(dataArray.front()));
        dataArray.erase(dataArray.begin());
        root->left = rdeserialize(dataArray);
        root->right = rdeserialize(dataArray);
        return root;
    }
    
    TreeNode* deserialize(string data) {
        list<string> dataArray;
        string str;
        for (auto& ch : data) {
            if (ch == ',') {
                dataArray.push_back(str);
                str.clear();
            } else {
                str.push_back(ch);
            }
        }
        if (!str.empty()) {
            dataArray.push_back(str);
            str.clear();
        }
        return rdeserialize(dataArray);
    }
    

    };
    时空复杂度O(n)

    0 赞同 0 条回复
  • 神经蛙 普通 2024年3月14日 上午12:11

    /**
    * 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:
    // Encodes a tree to a single string.
    string serialize(TreeNode
    root) {
    if (root nullptr) {
    return “”;
    }
    stringstream ss;
    queue<TreeNode*> q{{root}};
    while (!q.empty()) {
    int n = q.size();
    for (int i = 0; i < n; i++) {
    auto t = q.front();
    q.pop();
    if (t) {
    ss << t->val << “,”;
    q.push(t->left);
    q.push(t->right);
    } else {
    ss << “null,”;
    }
    }
    }
    string str = ss.str();
    return str.substr(0, str.length() – 1);
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        if (data.empty()) {
            return nullptr;
        }
        vector<string> nodes;
        stringstream ssin(data);
        string token;
        while (getline(ssin, token, ',')) {
            nodes.push_back(token);
        }
        TreeNode* root = new TreeNode(atoi(nodes[0].c_str()));
        queue<TreeNode*> q{{root}};
        int i = 1;
        while (!q.empty() && i < nodes.size()) {
            auto t = q.front();
            q.pop();
            if (nodes[i] != "null") {
                t->left = new TreeNode(atoi(nodes[i].c_str()));
                q.push(t->left);
            }
            i++;
            if (i < nodes.size() && nodes[i] != "null") {
                t->right = new TreeNode(atoi(nodes[i].c_str()));
                q.push(t->right);
            }
            i++;
        }
        return root;
    }
    

    };

    // Your Codec objectwill be instantiated and called as such:
    // Codec codec;
    // codec.deserialize(codec.serialize(root));
    思路:层序遍历,空节点使用null表示

    0 赞同 0 条回复
  • 白雪公主倒拔垂杨柳 永久会员 2024年3月13日 下午11:06
    public class Codec {
    
        // Encodes a tree to a single string.
        public String serialize(TreeNode root) {
            if(root== null ){
                return "";
            }
            StringBuilder build =  new StringBuilder();
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
    
            while(!queue.isEmpty()){
                TreeNode t = queue.poll();
                if(t!=null){
                    queue.add(t.left);
                    queue.add(t.right);
                    build.append(t.val+",");
                }
                else{
                    build.append("null,");
                }
            }
    
            return build.toString();
    
        }
    
        // Decodes your encoded data to tree.
        public TreeNode deserialize(String data) {
            if(data==null || data.length()<=0 ){
                return null;
            }
            String[] s =data.split(",");
            Queue<TreeNode> queue = new LinkedList<>();
            TreeNode root = new TreeNode(Integer.parseInt(s[0]));
            queue.add(root);
            int i=1;
            while(!queue.isEmpty()){
                TreeNode t = queue.poll();
                if(!s[i].equals("null")){
                    TreeNode left = new TreeNode(Integer.parseInt(s[i]));
                    t.left=left;
                    queue.add(left);
                }
                i++;
    
                if(!s[i].equals("null")){
                    TreeNode right = new TreeNode(Integer.parseInt(s[i]));
                    t.right=right;
                    queue.add(right);
                }
                i++;
            }
    
            return root;
        }
    }
    

    序列化:
    时间复杂度:O(n)
    额外空间复杂度:O(n)
    反序列化:
    时间复杂度:O(n)
    空间复杂度:O(n)

    0 赞同 0 条回复
  • mpweixin用户 普通 2024年3月13日 下午10:03

    java
    public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root == null) return "[]";
        StringBuilder res = new StringBuilder("[");
        Queue<TreeNode> queue = new LinkedList<>(){{add(root);}};
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            if(node != null){
                res.append(node.val + ",");
                queue.add(node.left);
                queue.add(node.right);
            }
            else res.append("null,");
        }
        res.deleteCharAt(res.length() - 1);
        res.append(']');
        return res.toString();
    }
    
    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data){
        if(data.equals("[]")) return null;
        String[] vals = data.substring(1,data.length() - 1).split(",");
        TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
        Queue<TreeNode> queue = new LinkedList<>(){{add(root);}};
        int i = 1;
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            if(!vals[i].equals("null")){
                node.left = new TreeNode(Integer.parseInt(vals[i]));
                queue.add(node.left);
            }
            i++;
            if(!vals[i].equals("null")){
                node.right = new TreeNode(Integer.parseInt(vals[i]));
                queue.add(node.right);
            }
            i++;
        }
        return root;
    }
    

    }
    提交

    0 赞同 0 条回复
  • Jimmy 普通 2024年3月13日 下午9:58

    序列化和反序列化的时间复杂度和空间复杂度都为O(n)

    /**
     * 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:
    
        // Encodes a tree to a single string.
        //层序遍历法,一层一层取出来连成字符串
        string serialize(TreeNode* root) {
            stringstream result;
            queue<TreeNode*> que;
            if(root == NULL)return "";
            else que.push(root);
            while(!que.empty()){
    
                for(int i=0;i<que.size();i++){
                    TreeNode* cur = que.front();
                    que.pop();
                    if(cur){
                        result << cur->val <<',';
                        que.push(cur->left);
                        que.push(cur->right);
                    }else{
                        result << "null,";
                    }
                }
    
            }
            string str = result.str();
            return str.substr(0,str.length()-1);
    
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            if(data.empty())return NULL;
            vector<string> nodes;
            stringstream ssin(data);
            string token;
            while(getline(ssin,token,',')){
                nodes.push_back(token);
            } 
            TreeNode *root = new TreeNode(atoi(nodes[0].c_str()));
            queue<TreeNode*> q{{root}};
            int i = 1;
            while(!q.empty() && i<nodes.size()){
                auto t = q.front();
                q.pop();
                if(nodes[i] != "null"){//查询数组中的元素,若不为”null“,则说明不为空节点,将其存放在队列中
                    t->left = new TreeNode(atoi(nodes[i].c_str()));
                    q.push(t->left);
                }
                i++;
                if(i<nodes.size() && nodes[i]!= "null"){
                    t->right = new TreeNode(atoi(nodes[i].c_str()));
                    q.push(t->right);
                }
                i++;
            }
            return root;
        }
    };
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec;
    // codec.deserialize(codec.serialize(root));
    
    0 赞同 0 条回复
  • 言之命至 普通 2024年3月13日 下午8:32

    层次遍历:

    public class Codec {
    
        // Encodes a tree to a single string.
        public String serialize(TreeNode root) {
            // 序列化成字符串,1,2,3,null,null,4,5,null...
    
            if(root == null){
                return "";
            }
            StringBuilder build = new StringBuilder();
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
    
            while(!queue.isEmpty()){
                TreeNode t = queue.poll();
                if(t != null){
                    queue.add(t.left);
                    queue.add(t.right);
                    build.append(t.val + ",");
                }else{
                    build.append("null,");
                }
            }
    
            return build.toString();
        }
    
        // Decodes your encoded data to tree.
        public TreeNode deserialize(String data) {
            // 1,2,3,null,null,4,5,null...
            if(data == null || data.length() <= 0){
                return null;
            }
            String[] s = data.split(",");
            Queue<TreeNode> queue = new LinkedList<>();
            TreeNode root = new TreeNode(Integer.parseInt(s[0]));
            queue.add(root);
            int i = 1;
            while(!queue.isEmpty()){
                TreeNode t = queue.poll();
                // 构建做左节点
                if(!s[i].equals("null")){
                    TreeNode left = new TreeNode(Integer.parseInt(s[i]));
                    t.left = left;
                    queue.add(left);
                }
                i++;
                // 构建右节点
                if(!s[i].equals("null")){
                    TreeNode right = new TreeNode(Integer.parseInt(s[i]));
                    t.right = right;
                    queue.add(right);
                }
                i++;
            }
            return root;
    
        }
    }
    

    时空复杂度都是O(n)

    0 赞同 0 条回复
  • Yuki 永久会员 2024年3月13日 下午8:12

    这题有点难了,明天再来一遍
    class Codec {
    public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        vector<int>vec;
        queue<TreeNode*>que;
        if(root==NULL)return NULL;
        que.push(root);
    
        //先记录
        while(!que.empty()){
            TreeNode*node=que.front();
            que.pop();
    
            if(node!=NULL){
                vec.push_back(node->val);
                que.push(node->left);
                que.push(node->right);
            }else{
                vec.push_back(-1);
            }
        }
    
        //再转字符串
        string res="[";
        for(int i=0;i<vec.size();i++){
            if(i>0)res+=",";
            res+=to_string(vec[i]);
        }
    
        res+="]";
        return res;
    }
    
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        if(data=="[]")return NULL;
    
        //字符串转数字
        vector<int>vec;
        for(int i=1;i<data.size()-1;i++){
            int val=data[i]-'0';
            if(val==-1){
                vec.push_back(-1);
            }else{
                vec.push_back(val);
            }
        }
    
        queue<TreeNode*>que;
        TreeNode*root=new TreeNode(vec[0]);//构建根节点
        que.push(root);
    
        int i=1;
        while(!que.empty()){
            //队列为空说明某一层为空
            TreeNode*node=que.front();
            que.pop();
    
            if(vec[i]!=-1){//不是空节点
                //创建左节点并压入
                node->left=new TreeNode(vec[i]);
                que.push(node->left);
            }else{
                node->left=NULL;//左节点为空
            }
    
            i++;
    
            if(vec[i]!=-1){//不是空节点
                //创建右节点并压入
                node->right=new TreeNode(vec[i]);
                que.push(node->right);
            }else{
                node->right=NULL;//左节点为空
            }
        }
    
        return root;
    }
    

    };

    0 赞同 0 条回复
  • MARS 普通 2024年3月13日 下午8:12

    day11第一题

    /**
     * Definition for a binary tree node.
     * function TreeNode(val) {
     *     this.val = val;
     *     this.left = this.right = null;
     * }
     */
    
    /**
     * Encodes a tree to a single string.
     *
     * @param {TreeNode} root
     * @return {string}
     */
    var serialize = function (root) {  //层序遍历,放入字符串中
      let res = ""
      if (root == null) {
        return res
      }
      let queue = [root]
      while (queue.length > 0) {
        let node = queue.shift()
        if (node) {
          queue.push(node.left)
          queue.push(node.right)
          res += node.val + ','  //, 用来分隔
        } else {
          res += "null,"
        }
      }
      return res
    };
    
    /**
    * Decodes your encoded data to tree.
    *
    * @param {string} data
    * @return {TreeNode}
    */
    var deserialize = function (data) {
      if (data.length <= 0 || data == null) return null
      let res = data.split(',');
      let root = new TreeNode(Number(res[0]))
      let queue = [root]
      let i = 1   //记录res中的下标,对应每个节点,
      while (queue.length > 0) {
        let node = queue.shift()
        if (res[i] != 'null') {  //一个节点有俩子节点,故加两次,到下一个节点
          let left = new TreeNode(Number(res[i++]))  //弹出节点的左节点
          node.left = left
          queue.push(left)
        }
        if (res[i] != 'null') {
          let right = new TreeNode(Number(res[i++]))
          node.right = right
          queue.push(right)
        }
      }
      return root
    };
    
    /**
    * Your functions will be called as such:
    * deserialize(serialize(root));
    */
    
    0 赞同 0 条回复
  • 方铎码农 普通 2024年3月13日 下午5:41
    // 只有层序遍历能做到一个字符串建构整个树
    public class Codec {
    
    
        // 层序遍历序列化
        // Encodes a tree to a single string.
        public String serialize(TreeNode root) {
            if(root == null){
                return "";
            }
            StringBuilder build = new StringBuilder();
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
    
            while(!queue.isEmpty()){
                TreeNode t = queue.poll();
                if(t != null){
                    queue.add(t.left);
                    queue.add(t.right);
                    build.append(t.val+",");
                } else {
                    build.append("null,");
                }
            }
    
            return build.toString();
        }
    
    
        // 层序遍历反序列化
        // Decodes your encoded data to tree.
        public TreeNode deserialize(String data) {
            if(data == null || data.length() <= 0){
                return null;
            }
            String[] s = data.split(",");
            Queue<TreeNode> queue = new LinkedList<>();
            TreeNode root = new TreeNode(Integer.parseInt(s[0]));
            queue.add(root);
            int i = 1;
            while(!queue.isEmpty()){
                TreeNode t = queue.poll();
                if(!s[i].equals("null")){
                    TreeNode left = new TreeNode(Integer.parseInt(s[i]));
                    t.left = left;
                    queue.add(left);
                }
                i++;
                if(!s[i].equals("null")){
                    TreeNode right = new TreeNode(Integer.parseInt(s[i]));
                    t.right = right;
                    queue.add(right);
                }
                i++;
            }
            return root;
        }
    }
    

    用层序遍历实现序列化和反序列化,时间复杂度和空间复杂度都和层序遍历相同,$O(n)$

    0 赞同 0 条回复
  • 王位詮釋 普通 2024年3月13日 下午4:17
    public class Codec {
    
        // Encodes a tree to a single string.
        public String serialize(TreeNode root) {
            if(root==null){
                return "";
            }
            StringBuilder result = new StringBuilder();
            Deque<TreeNode> deque = new  LinkedList<>();
            deque.offer(root);
            while(!deque.isEmpty()){
                TreeNode temp = deque.poll();
                if(temp!=null){
                    result.append(temp.val + ",");
                    deque.offer(root.left);
                    deque.offer(root.right);
                }else{
                    result.append("null,");
                }
            }
            return result.toString();
        }
    
        // Decodes your encoded data to tree.
        public TreeNode deserialize(String data) {
            if(data.length()<=0||data==null){
                return null;
            }
            String[] msg = data.split(",");
            Deque<TreeNode> deque = new LinkedList<>();
            TreeNode root = new TreeNode(Integer.parseInt(msg[0]));
            deque.offer(root);
            int i=1;
            while(!deque.isEmpty()){
                TreeNode temp = deque.poll();
                if(!msg[i].equals("null")){//构建左子节点
                    TreeNode left = new TreeNode(Integer.parseInt(msg[i]));
                    temp.left = left;
                    deque.offer(left);
                }
                i++;
                if(!msg[i].equals("null")){//构建右子节点
                    TreeNode right = new TreeNode(Integer.parseInt(msg[i]));
                    temp.right = right;
                    deque.offer(right);
                }
                i++;
            }
            return root;
        }
    }
    思路:层序遍历,将一个节点的左右子节点也序列化(只有在此节点不为空的情况下),通过进队出队进行序列化
    解码的时候也需要用到队列,先将字符串分离位一个一个的字符串,然后对每个字符串判断,如果字符串不为空,则为一个节点,并字符串数组指针往后移,然后给他分配子节点。
    
    0 赞同 0 条回复
  • 云无深雁影 普通 2024年3月13日 下午1:06

    public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root == null)
            return "";
        StringBuilder ans = new StringBuilder();
        Queue<TreeNode> list = new LinkedList<>();
        list.add(root);
        while(!list.isEmpty()){
            TreeNode tempList = list.remove();
            if(tempList==null){
                ans.append("n,");
                continue;
            }
            list.add(tempList.left);
            list.add(tempList.right);            
            ans.append(tempList.val).append(",");
        }
        //去除末尾n
        int i = ans.length()-1;
        while(i >= 0){
            if(ans.charAt(i) != ',' && ans.charAt(i) != 'n')
                break;
            i--;
        }
        return ans.substring(0,i+1);
    
    }
    
    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data.length()==0)
            return null;
        String vals[] = data.split(",");
        int ptr = 0;
        LinkedList<TreeNode> list = new LinkedList<>();
        TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
        list.add(root);
        while(ptr < vals.length){
            TreeNode tempRoot = list.remove();
            ptr++;
            if(ptr < vals.length && !"n".equals(vals[ptr])){
                tempRoot.left = new TreeNode(Integer.parseInt(vals[ptr]));
                list.add(tempRoot.left);
            }
            ptr++;
            if(ptr < vals.length && !"n".equals(vals[ptr])){
                tempRoot.right = new TreeNode(Integer.parseInt(vals[ptr]));
                list.add(tempRoot.right);
            }                   
        }
        return root;        
    }
    

    }
    //层序遍历
    //时空复杂度均为On

    0 赞同 0 条回复
  • RunAsOne 普通 2024年3月13日 下午12:59

    最后一次打卡二叉树,吃透了一下别人的代码

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Codec:
    
        def serialize(self, root):
            if not root:
                return "null,"
            res = str(root.val) + ","
            res += self.serialize(root.left)
            res += self.serialize(root.right)
            return res
    
        def deserialize(self, data):
            data = data.split(",")
            self.index = -1
            root = self.dfs(data)
            return root
    
        def dfs(self, data):
            self.index += 1
            if self.index >= len(data) or data[self.index] == "null":
                return None
            root = TreeNode(int(data[self.index]))
            root.left = self.dfs(data)
            root.right = self.dfs(data)
            return root
    
    
    # Your Codec object will be instantiated and called as such:
    # codec = Codec()
    # codec.deserialize(codec.serialize(root))
    
    0 赞同 0 条回复
  • heathhou 普通 2024年3月13日 下午12:50
    class Codec {
    public:
    
        // Encodes a tree to a single string.
        string serialize(TreeNode* root) {
            if(root == nullptr){
                return "";
            }
            stringstream ss;
            queue<TreeNode*> q;
            q.push(root);
    
            // 层序遍历,将节点保存到队列中
            while(!q.empty()){
                auto t = q.front();
                q.pop();
                if(t != nullptr){
                    q.push(t->left);
                    q.push(t->right);
                    ss << t->val << ",";
                }else{
                    ss << "null,";
                }
            }
            string s = ss.str();
            return s.substr(0, s.length() - 1);
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            if(data.empty()){
                return nullptr;
            }
    
            vector<string> nodes;
            stringstream ss(data);
            string token;
            // 解析字符串,将节点按照层序遍历的顺序存储到vector中
            while(getline(ss, token, ',')){
                nodes.push_back(token);
            }
    
            TreeNode* root = new TreeNode(atoi(nodes[0].c_str()));
            queue<TreeNode*> q;
            q.push(root);
    
            int i = 1;
            while(!q.empty() && i < nodes.size()){
                auto t = q.front(); q.pop();
                if(nodes[i] != "null"){
                    t->left = new TreeNode(atoi(nodes[i].c_str()));
                    q.push(t->left);
                }
    
                ++i;
                if(i < nodes.size() &&  nodes[i] != "null"){
                    t->right = new TreeNode(atoi(nodes[i].c_str()));
                    q.push(t->right);
                }
    
                ++i;
            }
    
            return root;
    
        }
    };
    
    0 赞同 0 条回复
  • 机电皮怪 永久会员 2024年3月13日 下午12:27

    本来是想用前序+中序遍历加密,然后用之前的重建二叉树解码,结果它里面包含重复元素使我的哈希表失效
    只能用官方的前序遍历+记录none节点的方法解题了
    时间复杂度O(n)
    空间复杂度O(n)

    “`C++
    class Codec {
    public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) 
    {
        string result;
        serialize_f(root, result);
        return result;
    }
    
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        //解码
        list<string> str_data;
        string str;
        for(auto& ch : data)
        {
            if(ch == ',')
            {
                str_data.push_back(str);
                str.clear();
            }
            else
            {
                str.push_back(ch);
            }
        }
        if(str.empty() == false)
        {
            str_data.push_back(str);
            str.clear();
        }
    
        return build(str_data);
    }
    

    private:
    //前序遍历
    void serialize_f(TreeNode* root, string& str)
    {
    if(root nullptr)
    {
    str += “none,”;
    return;
    }

        str += to_string(root->val) + ",";
        serialize_f(root->left, str);
        serialize_f(root->right, str);
    }
    
    //建立二叉树
    TreeNode* build(list<string>& data)
    {
        //递归结束条件
        if(data.front() == "none")
        {
            data.erase(data.begin());
            return nullptr;
        }
    
        TreeNode* node = new TreeNode(stoi(data.front()));
        data.erase(data.begin());
        //递归建立左子树
        node->left = build(data);
        //递归建立右子树
        node->right = build(data);
    
        return node;
    }
    

    };

    “`

    0 赞同 0 条回复
  • Thaddeus 永久会员 2024年3月13日 上午8:24

    打卡

     // 层序遍历
    class Codec {
    public:
        // Encodes a tree to a single string.
        string serialize(TreeNode* root) {
            if(!root) return "";
    
            stringstream ss;
            queue<TreeNode*> que;
            que.push(root);
            while(!que.empty()) {
                TreeNode* cur = que.front(); que.pop();
                if(cur) {
                    que.push(cur->left);
                    que.push(cur->right);
                    ss << cur->val << ",";
                } else ss << "null,";
            }
            string s = ss.str();
            return s;
    
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            if(data.empty()) return nullptr;
    
            vector<string> s;
            stringstream ss(data);
            string str;
            while(getline(ss, str, ',')) {
                s.emplace_back(str);
            }
            queue<TreeNode*> que;
            TreeNode* root = new TreeNode(stoi(s[0]));
            que.push(root);
            int i = 1;
            while(!que.empty()) {
                TreeNode* cur = que.front(); que.pop();
                if(s[i] != "null") {
                    TreeNode* left = new TreeNode(stoi(s[i]));
                    cur->left = left;
                    que.push(left);
                }
                i++;
                if(s[i] != "null") {
                    TreeNode* right = new TreeNode(stoi(s[i]));
                    cur->right = right;
                    que.push(right);
                }
                i++;
            }
            return root;
        }
    };
    
    0 赞同 0 条回复

# 回答此问题

后才能回答