Fork me on GitHub

剑指offer-序列化二叉树

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

  • 以前提交的内存超出了,可能现在要用非递归实现了
#include<iostream>
#include<math.h>

#include <vector>
#include <string>
#include <deque>
#include <stack>
#include <queue>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>

#include <algorithm>
#include <functional>
#include <numeric> //accmulate

#include <iterator> //ostream_iterator
#include <fstream>
#include <iomanip>  //setprecision() setw()

#include <memory> 
#include <cstring> //memset
using namespace std;

//#define cin infile //一定不能再oj系统中,有错,导致超时等!!!
//C++文件输入
ifstream infile("in.txt", ifstream::in);

#include <limits>
#define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value */
#define INT_MAX       2147483647    /* maximum (signed) int value */

#include <array>
#include <bitset>

// Definition for singly - linked list.
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};


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


//1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点
//不为空时,在转化val所得的字符之后添加一个' , '作为分割。对于空节点则以 '#' 代替。
//2. 对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树(特别注意:
//在递归时,递归函数的参数一定要是char ** ,这样才能保证每次递归后指向字符串的指针会
//随着递归的进行而移动
class Solution_Serialize{
public:
    void help_seri(TreeNode* root, string &res)
    {
        if (!root)
        {
            res += '#,';
            return;
        }
        //前序遍历
        //char r[10];
        //sprintf(r, "%d", root->val);
        string r = to_string(root->val);
        res += r;
        res += ',';
        help_seri(root->left, res);
        help_seri(root->right, res);

    }

    char* Serialize(TreeNode *root) {

        if (!root)
        {
            return nullptr;
        }

        string res;

        help_seri(root, res);

        return const_cast<char*>(res.c_str());
    }

    // 由于递归时,会不断的向后读取字符串,所以一定要用**str,以保证得到递归后指针str指向未被读取的字符
    TreeNode* help_deseri(char** str)
    {
        if (**str=='#')
        {
            (*str)++;
            return nullptr;
        }
        int num = 0;
        while (**str != '\0'&&**str != ',')
        {
            num = num * 10 + (**str-'0');
            ++(*str);
        }
        TreeNode* node = new TreeNode(num);
        if (**str=='\0')
        {
            return node;
        }
        else
        {
            ++(*str);
        }

        node->left = help_deseri(str);
        node->right = help_deseri(str);

        return node;
    }

    TreeNode* Deserialize(char *str) {

        if (str==NULL)
        {
            return nullptr;
        }

        TreeNode* ret = help_deseri(&str);

        return ret;
    }
};


int main()
{
    Solution_Serialize su_1;
    char str[] = { '3', ',', '9', ',', '20', ',', ' #', '#', '15', ',', '7', ',' };
    TreeNode* ret = su_1.Deserialize(str);
    
    return 0;
}

 

posted @ 2018-05-10 16:19  ranjiewen  阅读(445)  评论(0编辑  收藏  举报