刷题《剑指Offer》day15

题目来源:力扣《剑指Offer》第二版
完成时间:2022/08/10

37. 序列化二叉树

image-20220815175215778

题目链接:剑指 Offer 37. 序列化二叉树 - 力扣(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:

    void traverse(TreeNode* node,string& answer) {
    
    
        if(node == nullptr) return;
        queue<TreeNode*> que;
        que.push(node);
        answer += to_string(node->val) + ",";
        while(!que.empty()) {
    
    
            TreeNode* tmp = que.front();
            que.pop();
            if(tmp->left){
    
    
                que.push(tmp->left);
                answer += to_string(tmp->left->val) + ",";
            } 
            else answer += "*,";
            if(tmp->right) {
    
    
                que.push(tmp->right);
                answer += to_string(tmp->right->val) + ",";
            } else answer += "*,";
        }
    }

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
    
    
        string tree = "";
        traverse(root,tree);
        return tree;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
    
    
        if(data == "") return NULL;
        int pos = 0;
        int indexOfdot = 0;
        vector<string> treeVec;
        while(pos != data.size()){
    
    
            indexOfdot = data.find(",",pos);
            string str = data.substr(pos,(indexOfdot-pos));
            treeVec.push_back(str);
            pos = indexOfdot + 1;
        }
        pos = 0;
        TreeNode* head = new TreeNode(atoi(treeVec[0].c_str()));
        queue<TreeNode*> que;
        que.push(head);
        while(!que.empty()) {
    
    
            int size = que.size();
            TreeNode* tmp = NULL;
            for(int i = 1;i <= size;i++) {
    
    
                tmp = que.front();
                que.pop();
                if(treeVec[pos+1] != "*") {
    
    
                    tmp->left = new TreeNode(atoi(treeVec[pos+1].c_str()));
                    que.push(tmp->left);
                }
                if(treeVec[pos+2] != "*") {
    
    
                    tmp->right = new TreeNode(atoi(treeVec[pos+2].c_str()));
                    que.push(tmp->right);
                }
                pos += 2;
            }
        }
        return head;
    }
};

// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));

猜你喜欢

转载自blog.csdn.net/m0_46369272/article/details/126351830
今日推荐