Leetcode 297. 二叉树的序列化与反序列化(DAY 23)(Hard细节挺多的 需要调试一会 含题解)
发布日期:2021-06-30 22:24:28
浏览次数:2
分类:技术文章
本文共 3719 字,大约阅读时间需要 12 分钟。
原题题目
代码实现(首刷绝大部分自解)
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; *//** Encodes a tree to a single string. */char* serialize(struct TreeNode* root){ //基本思路 层序遍历if(!root) return NULL; char* tree = (char*)malloc(sizeof(char) * 100000); //这里的charpos是记录字符串当前到什么位置了 int size = 0,rear = -1,top = -1,charpos = 0; struct TreeNode* queue[50000],*pos = root; queue[++rear] = pos; while(rear != top) { size = rear - top; while(size--) { pos = queue[++top]; if(!pos) charpos += sprintf(tree+charpos,",%s","null"); else { if(!top) charpos += sprintf(tree+charpos,"%d",pos->val); else charpos += sprintf(tree+charpos,",%d",pos->val); //当存在时 则导入其节点 不存在时 则放入NULL 方便检测 if(pos->left) queue[++rear] = pos->left; else queue[++rear] = NULL; if(pos->right) queue[++rear] = pos->right; else queue[++rear] = NULL; } } //当只存在空结点时 则退出循坏 if(rear - top == nullnumbers) break; } return tree;}/** Decodes your encoded data to tree. */struct TreeNode* deserialize(char* data) { if(!data) return NULL; //这里是设定最小值 const int MIN = -99999; int numpos = 0,charpos = 0,num[50000],number,tempnumpos = 0,nextlevel; struct TreeNode* stack[50000],*realroot,*root; bool flag;//flag的作用是检测是否为负数 因为负数占两个格子 //下面的while主要将有效数字提取出来 变成数组 while(charpos < strlen(data)) { flag = false; if(data[charpos] == ',') charpos++; number = 0; //当出现负数时 if(data[charpos] == '-') { flag = true; charpos++; } if(data[charpos] >= '0' && data[charpos] <= '9') { while(data[charpos] >= '0' && data[charpos] <='9') number = number*10 + data[charpos++] - '0'; if(!flag) num[numpos++] = number; else num[numpos++] = -number; } else { num[numpos++] = MIN; charpos += 4; } } //创建根节点 realroot = (struct TreeNode*)malloc(sizeof(struct TreeNode)); realroot->val = num[tempnumpos]; realroot->left = realroot->right = NULL; stack[tempnumpos] = realroot; //nextlevel的作用是 确定左右节点的在数组中的位置 nextlevel = tempnumpos+1; while(tempnumpos < numpos) { if(num[tempnumpos] != MIN) { if(nextlevel < numpos && num[nextlevel] != MIN) { root = (struct TreeNode*)malloc(sizeof(struct TreeNode)); root->val = num[nextlevel]; root->right = root->left = NULL; stack[tempnumpos]->left = root; stack[nextlevel] = root; } else stack[tempnumpos]->left = NULL; //向下移动位置 nextlevel++; if(nextlevel < numpos && num[nextlevel] != MIN) { root = (struct TreeNode*)malloc(sizeof(struct TreeNode)); root->val = num[nextlevel]; root->left = root->right = NULL; stack[tempnumpos]->right = root; stack[nextlevel] = root; } else stack[tempnumpos]->right = NULL; //向下移动位置 nextlevel++; } tempnumpos++; } while(tempnumpos < numpos); return realroot;}// Your functions will be called as such:// char* data = serialize(root);// deserialize(data);
转载地址:https://love6.blog.csdn.net/article/details/112452218 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月14日 14时23分32秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
nginx访问控制、基于用户认证、https配置
2019-04-30
SaltStack
2019-04-30
linux内存的寻址方式
2019-04-30
ubunut16.04的pip3出现问题,重新安装pip3
2019-04-30
how2heap-double free
2019-04-30
how2heap-fastbin_dup_consolidate
2019-04-30
orw_shellcode_模板
2019-04-30
[fmt+shellcode]string
2019-04-30
fmt在bss段(neepusec_easy_format)
2019-04-30
python 函数式编程
2019-04-30
python编码
2019-04-30
redis cli
2019-04-30
java 解析json
2019-04-30
java http请求
2019-04-30
tensorflow 数据格式
2019-04-30
tf rnn layer
2019-04-30
tf input layer
2019-04-30
tf model create
2019-04-30
tf dense layer两种创建方式的对比和numpy实现
2019-04-30
tf initializer
2019-04-30