请实现两个函数,分别用来序列化和反序列化二叉树
- 以前提交的内存超出了,可能现在要用非递归实现了
#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 != '