* Computer Science/Algorithm

297. Serialize and Deserialize Binary Tree

soicem 2021. 2. 9. 07:54

link: leetcode.com/problems/serialize-and-deserialize-binary-tree/

 

Input: root = [1,2,3,null,null,4,5]

Output: [1,2,3,null,null,4,5]

/**
 * 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 serializeLoop(TreeNode* node){
        // from left to right
        if(!node){
            return "null";
        }
        string ret = to_string(node->val);
        
        return ret + "," + serializeLoop(node->left) + "," + serializeLoop(node->right);
    }
    
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        if(!root){
            return "[]";
        }
        return "[" + serializeLoop(root) + "]";
    }

    vector<int> tokens;
    
    TreeNode* deserializeLoop(int pos){
        TreeNode* node = new TreeNode(tokens[pos]);
        int leftMove = 2 * pos + 1;
        int rightMove = 2 * pos + 2;
        int tokensLen = tokens.size();
        
        if(leftMove < tokensLen){
            node->left = deserializeLoop(2 * pos + 1);    
        }
        if(rightMove < tokensLen){
            node->right = deserializeLoop(2 * pos + 2);    
        }
        return node;
    }
    
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        string token = "";
        for(int i = 1; i < data.size(); i++){
            if(data[i] == ',' || data[i] == ']'){
                if(token == "null"){
                    tokens.push_back(NULL);
                } else {
                    stringstream degree(token);
                    int t = 0;
                    degree >> t;
                    tokens.push_back(t);    
                }
                token = "";
                continue;
            }
            token += data[i];
        }
        
        return deserializeLoop(0);
    }
};

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

 위는 02-09 출근 전에 dfs로 짠 코드이다.  expected sequence를 보고 bfs로 짜야하는 부분을 놓쳤고, string to int에서 leetcode에서는 stoi가 먹히지 않은 부분, bfs로 돌면 맨 마지막 NULL 처리를 어떻게 할 것인지 고민해야한다.

 

/**
 * 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 serializeLoop(TreeNode* node){
        // from left to right
        if(!node){
            return "null";
        }
        string ret = to_string(node->val);
        
        return ret + "," + serializeLoop(node->left) + "," + serializeLoop(node->right);
    }*/
    
    string bfs(TreeNode* node){
        string ret = "[";
        queue<TreeNode*> que;
        
        int normals = 1;
        que.push(node);
        
        while(!que.empty()){
            if(normals == 0){
                break;
            }
            
            TreeNode* cur = que.front();
            que.pop();
            
            if(cur) {
                normals--;
                ret += to_string(cur->val) + ",";
                
                que.push(cur->left);
                if(cur->left){
                    normals++;
                }
                que.push(cur->right);
                if(cur->right){
                    normals++;
                }
            } else {
                ret += "null,";
            }
        }
        ret[ret.size() - 1] = ']';
        return ret;
    }
    
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        if(!root){
            return "[]";
        }
        return bfs(root);
    }

    vector<int> tokens;
    
    TreeNode* deserializeLoop(){
        TreeNode* node = new TreeNode(tokens[0]);
        queue<TreeNode*> que;
        que.push(node);
        int pos = 1;
        
        while(!que.empty()){
            if(pos >= tokens.size()) break;
            TreeNode* cur = que.front();
            que.pop();
            
            if(cur == NULL) continue;
            
            if(pos < tokens.size() && tokens[pos] != -1001){
                cur->left = new TreeNode(tokens[pos]);    
            }
            if(pos + 1 < tokens.size() && tokens[pos + 1] != -1001)
                cur->right = new TreeNode(tokens[pos + 1]);
            pos += 2;
            
            que.push(cur->left);
            que.push(cur->right);
        }
        return node;
    }
    
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        string token = "";
        for(int i = 1; i < data.size(); i++){
            if(data[i] == ',' || data[i] == ']'){
                if(token == "") continue;
                
                if(token == "null"){
                    tokens.push_back(-1001);
                } else {
                    stringstream degree(token);
                    int t = 0;
                    degree >> t;
                    tokens.push_back(t);    
                }
                token = "";
                continue;
            }
            token += data[i];
        } 
        
        if(tokens.empty()) return NULL;
        
        return deserializeLoop();
    }
};

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

 BFS와 NULL 처리 변경인데, solution은 DFS로 되어있어서 스터디할때 한 번 봐야겠다. - 2021-02-10

'* Computer Science > Algorithm' 카테고리의 다른 글

642. Design Search Autocomplete System  (0) 2021.02.13
380. Insert Delete GetRandom O(1)  (0) 2021.02.11
알고리즘 추후 계획  (0) 2020.05.27
leetcode 300문제 !  (0) 2020.05.13
baekjun 고층빌딩  (0) 2018.11.11