二叉树的序列化与反序列化——二叉树与字符串的转换,超时bug

RichAndMerry 2020-02-26 10:40:43
二叉树的序列化与反序列化
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "1 2 ##3 4 ##5 ##"
现在报错超时。不知道我下面的字符串传递是不是可以这样用,还是说是其他的问题?
void dfs(struct TreeNode *root, char *s);
char* serialize(struct TreeNode* root) {
if(root == NULL)
return NULL;
char *re = (char*)malloc(sizeof(char) * 5000);
dfs(root, re);
return re;
}
void dfs(struct TreeNode *root, char *s)
{
if(root == NULL)
{
strcat(s, "#");//如果是NULL,在字符串后添加“#”;
return;
}
int temp = root->val;
int index = strlen(s);
while(temp)
{
s[index++] =(char)(temp % 10 + '0');//直接将数值,添加在字符串后面,最后加一个空格,区别,数值哪里截至。
temp /= 10;
}
s[index++] = ' ';
s[index] = '\0';
dfs(root->left, s);
dfs(root->right, s);
}
/** Decodes your encoded data to tree. */
struct TreeNode* deserialize(char* data) {

if(data[0] == '\0')
return NULL;
if(data[0] == '#')
{
data = data + 1;//如果传递过来的字符串第一个是"#", 则将字符串地址转换为下一个索引的位置。
return NULL;
}
struct TreeNode * root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
root->val = 0;
int i = 0;
for(i = 0; data[i] >= '0' && data[i] <= '9'; i++)
{
root->val *= 10;
root->val += (int)(data[i] - '0');
}
data = data + i + 1; //当前的数值,取出后,将字符串的地址改为该数值以及其后空格,之后的一个地址。这里不知道这种操作是否可行??????????
root->left = deserialize(data);
root->right = deserialize(data);
return root;
}
// Your functions will be called as such:
// char* data = serialize(root);
// deserialize(data);
...全文
125 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2020-02-27
  • 打赏
  • 举报
回复
这就是一个二叉树的中序遍历过程,再遍历的过程当中,输出或者读取界节点内容 // 输出 void ioOutput(TreeNode* pTree, FILE* fp ){ 输出 pTree->data; if ( pTree -> left ) ioOutput( pTree->left, fp) ; else 输出 #; if (pTree->right) ioOutput(pTree->right, fp); else 输出# } // 读入 TreeNode * ioInput(FILE * fp) { ElementType data = 读入数据 if ( data == '#' ) return NULL; TreeNode * pTree = (TreeNode*) malloc(TreeNode); pTree->data = data; pTree->left = ioInput(fp); pTree->right = ioInput(fp); return pTree; }
GKatHere 2020-02-27
  • 打赏
  • 举报
回复
"你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。" 这里所说的字符串,并不一定是文字字符串,也可以是二进制的吧。所以你可以省略,文字到数字的转换过程。 另外 char *str = (char*)malloc(sizeof(char) *12); // char str [12]就行了,二叉树不会太深
RichAndMerry 2020-02-27
  • 打赏
  • 举报
回复
换了一种方式写。终于过了,虽然耗时和耗内存比较大。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/** Encodes a tree to a single string. */
void dfs(struct TreeNode *root, char *s);
struct TreeNode* de(char* data, int *index, int len);
char* serialize(struct TreeNode* root) {
if(root == NULL)
return NULL;
char *re = (char*)malloc(sizeof(char) * 5000);
re[0] = '\0';
dfs(root, re);
return re;
}
void dfs(struct TreeNode *root, char *s)
{
if(root == NULL)
{
strcat(s, "#");
return;
}
char *str = (char*)malloc(sizeof(char) *12);
sprintf(str, "%d ", root->val);
//itoa(root->val, str, 10); itoa函数与ANSI标准是不兼容的;
strcat(s, str);
//strcat(s, " ");
free(str);
dfs(root->left, s);
dfs(root->right, s);
}
/** Decodes your encoded data to tree. */
struct TreeNode* deserialize(char* data) {

if(data == NULL)
return NULL;
int index = 0;
int len = strlen(data);
return de(data, &index, len);
}
struct TreeNode* de(char* data, int *index, int len)
{
//int len = strlen(data);
if((*index) >= len)
return NULL;
if((*index) < len && data[*index] == '#')
{
(*index)++;
return NULL;
}
int flag = 1;
if(data[*index] == '-')
{
flag = -1;
(*index)++;
}
else if(data[*index] == '+')
{
(*index)++;
}
struct TreeNode * root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
root->val = 0;
while((*index) <= len && data[*index] >= '0' && data[*index] <= '9')
{
root->val *= 10;
root->val += (int)(data[(*index)] - '0');
(*index)++;
}
root->val *= flag;
(*index)++;
root->left = de(data, index, len);
root->right = de(data, index, len);
return root;
}

// Your functions will be called as such:
// char* data = serialize(root);
// deserialize(data);

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧