#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 != '