序列化二叉树

  1. 题目描述
    1. 解题思路

题目描述

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

解题思路

  1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点
    不为空时,在转化val所得的字符之后添加一个’ , ‘作为分割。对于空节点则以 ‘#’ 代替。
  2. 对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树(特别注意:
    在递归时,递归函数的参数一定要是char ** ,这样才能保证每次递归后指向字符串的指针会
    随着递归的进行而移动!!!)
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/

class Solution {  
public:
    char* Serialize(TreeNode *root) {
        // 空树
       if(root == nullptr)
           return nullptr;
        string str;
        Serialize(root, str);
        char *ret = new char[str.length() + 1];
        int i;
        for(i = 0; i < str.length(); i++){
            ret[i] = str[i];
        }
        ret[i] = '\0';
        return ret;
    }
    // 递归序列化
    void Serialize(TreeNode *root, string& str){
        if(root == NULL){
            str += '#';// 空叶子节点标志
            return ;
        }
        string r = to_string(root->val);
        str += r;
        str += ',';// 节点数据的终止符
        // 递归序列化左右子树
        Serialize(root->left, str);
        Serialize(root->right, str);
    }
     
    TreeNode* Deserialize(char *str) {
        if(str == NULL)
            return NULL;
        TreeNode *ret = Deserialize(&str);
        return ret;
    }
    // 递归反序列话,构建二叉树,双层指针,是为了可以递归减少序列化串的长度
    TreeNode* Deserialize(char **str){
        // 到达叶子节点
        if(**str == '#'){       //所以一定要用**str,
            ++(*str);           //以保证得到递归后指针str指向未被读取的字符
            return NULL;
        }
        // 获取节点的值,以“,”为终止节点
        int num = 0;
        while(**str != '\0' && **str != ','){
            num = num*10 + ((**str) - '0');
            ++(*str);
        }
        // 新建节点
        TreeNode *root = new TreeNode(num);
        if(**str == '\0') // 到达序列化串的最后
            return root;
        else // 否则到达的是 “,”
            (*str)++;
        // 递归构建左右子树
        root->left = Deserialize(str);
        root->right = Deserialize(str);
        return root;
    }
};

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com

💰

Title:序列化二叉树

Count:508

Author:攀登

Created At:2019-12-26, 23:12:31

Updated At:2024-06-15, 15:53:35

Url:http://jiafeimao-gjf.github.io/2019/12/26/sword-%E5%BA%8F%E5%88%97%E5%8C%96%E4%BA%8C%E5%8F%89%E6%A0%91/

Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.

×

Help us with donation