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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Leetcode 1641. 统计字典序元音字符串的数目(DAY 24 动态规划开始 ---鸽子一星期准备考试)----动态规划学习期
下一篇:Leetcode 99. 恢复二叉搜索树(DAY 22 Hard含题解)

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月14日 14时23分32秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章