AcWing 50 序列化二叉树

题目描述:

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

您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。

样例

你可以序列化如下的二叉树
    8
   / \
  12  2
     / \
    6   4

为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"

注意:

  • 以上的格式是AcWing序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。

分析:

完全模拟前序遍历,在前序遍历递归的算法下修改实现方式。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string s;
        dfs_s(root,s);
        return s;
    }
    void dfs_s(TreeNode* root,string &s){
        if(!root){
            s += "null ";
            return;
        }
        s += to_string(root->val) + ' ';
        dfs_s(root->left,s);
        dfs_s(root->right,s);
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        int u = 0;
        return dfs_t(data,u);
    }
    TreeNode* dfs_t(string s,int &u){
        if(u == s.size())   return NULL;
        int k = u;
        while(s[k] != ' ')  k++;
        if(s[u] == 'n'){
            u = k + 1;
            return NULL;
        }
        int val = 0;
        for(int i = u;i < k;i++)    val = val * 10 + s[i] - '0';
        u = k + 1;
        auto root = new TreeNode(val);
        root->left = dfs_t(s,u);
        root->right = dfs_t(s,u);
        return root;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_30277239/article/details/88370577