【剑指offer】【树】37.序列化二叉树

题目链接:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/

递归

前序遍历序列化成字符串,在反序列化回去
注意:不要忘记null和数字后面空格,空格作为分隔两个节点的标识
时间复杂度:O(n)
空间复杂度: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) {
        string res;
        dfs_s(root, res);
        return res;
    }
    void dfs_s(TreeNode* root, string &res)
    {
        if(!root) {
            res += "null ";
            return ;
        }
        res += to_string(root->val) + ' ';
        dfs_s(root -> left, res);
        dfs_s(root -> right, res);
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        int u = 0;
        return dfs_d(data, u);
    }

    TreeNode* dfs_d(string data, int &u)
    {
        if(u == data.size()) return NULL;
        //取出来下一个元素
        int k = u;
        while(data[k] != ' ') k++;
        //如果为空
        if(data[u] == 'n'){
            u = k + 1;
            return NULL;
        }
        int val = 0;
        if(data[u] == '-'){
            //把字符串转换成整数
            for (int i = u+1; i < k; i++) val = val * 10 + data[i] - '0';
            val  = -val;
        }
        else{
        //如果是数字是正的
            for (int i = u; i < k; i++) val = val * 10 + data[i] - '0';
        }
        //更新到下一个位置
        u = k + 1;
        //前序遍历,先取的一定是根节点,之后取的一定是左子树,最后取的一定是右子树
        //根节点
        auto root = new TreeNode(val);
        //根节点的左儿子
        root -> left = dfs_d(data, u);
        //根节点的右儿子
        root -> right = dfs_d(data, u);
        return root;
    }
};

// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
posted @ 2020-04-17 08:36  NaughtyCoder  阅读(78)  评论(0)    收藏  举报