【剑指offer-解题系列(62)】序列化二叉树

题目描述

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

由于没有要求如何定义序列,所以采用先序遍历,这样比较容易分割字符,然后NULL都是用#表示

定义两个函数cutnum 和 num2str 用于分割字符串和把字符串转化为整数

另外定义递归函数readtree 和buildtree 按照先序遍历方式读取和重建二叉树


代码实现

  int cutnum(string &str) {

        if (str[0] == '#') {
            str = str.substr(2, str.size() - 2);
            return -1;
        }
        int i = 0;
        for (i = 0; i         {
            if (str[i] == '+')
                break;
        }
        string ns = str.substr(0, i);
        str = str.substr(i + 1, str.size() - i - 1);
        return atoi(ns.c_str());
    }


    string num2str(int a) {
        char t[100] = { '\0' };
        sprintf(t, "%d+", a);
        return string(t);
    }


    void readTree(TreeNode*root, string&str) {
        if (root == NULL)
            str += "#+";
        else {
            str += num2str(root->val);
            readTree(root->left, str);
            readTree(root->right, str);
        }
    }




    void buildTree(TreeNode* &root, string &str) {


        if (str.size() <= 0)
            return;
        int num = cutnum(str);


        if (num == -1) {
            delete root;
            root = NULL;
            return;
        }




        root->val = num;
        root->left = new TreeNode(0);
        root->right = new TreeNode(0);
        buildTree(root->left, str);
        buildTree(root->right, str);


    }


    TreeNode* Deserialize(char *s) {
        if (s == NULL)
            return NULL;
        string str(s);
        if (str.size() <= 0)
            return NULL;
        TreeNode*root = new TreeNode(0);
        buildTree(root, str);
        return root;


    }


    char * Serialize(TreeNode *root) {
        string str;
        if (!root)
            return NULL;
        readTree(root, str);
        char*res = new char[256];
        memset(res,'\0',256);
        memcpy(res, str.c_str(), str.size());
        return res;
    }

你可能感兴趣的:(算法实现)