美文网首页
剑指offer 38- 序列化二叉树

剑指offer 38- 序列化二叉树

作者: 顾子豪 | 来源:发表于2021-05-24 09:08 被阅读0次

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

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

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

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

注意:

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

分析:

class Solution {
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 += "nullptr ";//如果当前节点为空,保存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) {//这里的u是传的引用,不是值传递
        if(data.size() == u) return nullptr;//如果已经达到了字符串的尾端,则退出。
        
        int k = u;
        while(data[k] != ' ') k++;//退出的时候,k指向了字符的中间的空格,所以回到下个字符的首部需要加1
        if(data[u] == 'n') {//如果当前字符串是“null”
            u = k+1;//回到下一个数字的首部,注意是u = k+1, 不是u = u+1;
            return nullptr;;//表示这次构造的是一个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;
    }
};

相关文章

网友评论

      本文标题:剑指offer 38- 序列化二叉树

      本文链接:https://www.haomeiwen.com/subject/ugzljltx.html