请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。
序列化可以基于 先序、中序、后序、按层 的二叉树遍历方式来进行修改。原理都是一样的(即遍历顺序不同而已,对每个结点的处理都是一样的),序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
借鉴方法1:
return (char*)res;
typedef TreeNode node; typedef TreeNode* pnode; typedef int* pint; class Solution { vector<int> buf; void dfs(pnode p){ if(!p) buf.push_back(0x23333); else{ buf.push_back(p -> val); dfs(p -> left); dfs(p -> right); } } pnode dfs2(pint& p){ if(*p == 0x23333){ ++p; return NULL; } pnode res = new node(*p); ++p; res -> left = dfs2(p); res -> right = dfs2(p); return res; } public: char* Serialize(TreeNode *p) { buf.clear(); dfs(p); int *res = new int[buf.size()]; for(unsigned int i = 0; i < buf.size(); ++i) res[i] = buf[i]; return (char*)res; //将int数组转char*字符串 } TreeNode* Deserialize(char *str) { int *p = (int*)str; return dfs2(p); } };借鉴方法2: to_string()函数
/* 1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点 不为空时,在转化val所得的字符之后添加一个' , '作为分割。对于空节点则以 '#' 代替。 2. 对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树(特别注意: 在递归时,递归函数的参数一定要是char ** ,这样才能保证每次递归后指向字符串的指针会 随着递归的进行而移动!!!) */ class Solution { public: char* Serialize(TreeNode *root) { if(root == NULL) return NULL; 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; } };
https://blog.csdn.net/lzuacm/article/details/52704931
定义于头文件
std::string to_string( int value ); (1) (C ++11起)
std::string to_string( long value ); (2) (C ++11起)
std::string to_string( long long value ); (3) (C ++11起)
std::string to_string( unsigned value ); (4) (C ++11起)
std::string to_string( unsigned long value ); (5) (C ++11起)
std::string to_string( unsigned long long value ); (6) (C ++11起)
std::string to_string( float value ); (7) (C ++11起)
std::string to_string( double value ); (8) (C ++11起)
std::string to_string( long double value ); (9) (C ++11起)
std::to_string
是C++标准(2011年)的最新版本中引入的功能。旧的编译器可能不支持它。
1) 有符号十进制整数转换为字符串内容相同的std::sprintf(buf, “%d”, value)会产生足够大的buf
.
2) 有符号十进制整数转换为字符串内容相同的std::sprintf(buf, “%ld”, value)会产生足够大的buf
.
3) 有符号十进制整数转换为字符串内容相同的std::sprintf(buf, “%lld”, value)会产生足够大的buf
.
4)std::sprintf(buf, "%u", value)
会产生足够大的buf
了同样内容的一个字符串转换成一个无符号十进制整数.
5)std::sprintf(buf, "%lu", value)
会产生足够大的buf
了同样内容的一个字符串转换成一个无符号十进制整数.
6)std::sprintf(buf, "%llu", value)
会产生足够大的buf
了同样内容的一个字符串转换成一个无符号十进制整数.
6)std::sprintf(buf, "%llu", value)
会产生足够大的buf
了同样内容的一个字符串转换成一个无符号十进制整数.
@ 7,8 @std::sprintf(buf, "%f", value)
会产生足够大的buf
了同样内容的一个字符串转换成一个浮点值.
9) std::sprintf(buf, "%Lf", value)
会产生足够大的buf
了同样内容的一个字符串转换成一个浮点值.
参数
value - 一个数值转换
返回值
一个字符串保持转换后的值