二叉树的广义表反序列化

2024-05-27 01:36

本文主要是介绍二叉树的广义表反序列化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

个人小记


一、代码

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_NODE 10
#define MAX_LEN 100
#define key(n)(n)?(n->key):(-1)
typedef struct Node
{int key;struct Node* lchild,*rchild;
}Node;Node* init_node(int key)
{Node* node=(Node*)malloc(sizeof(Node));node->key=key;node->lchild=node->rchild=NULL;return node;
}Node* insert(Node* root,int key)
{if(root==NULL)return init_node(key);if(rand()%2)root->lchild=insert(root->lchild,key);else root->rchild=insert(root->rchild,key);return root;
}Node* getnewtree(Node* root,int n)
{for(int i=0;i<n;i++){root=insert(root,rand()%100);}return root;
}void clear(Node* root)
{if(root==NULL)return ;clear(root->lchild);clear(root->rchild);free(root);return ;
}char buff[MAX_LEN];
int len;
void __serial(Node* root)
{if(root==NULL)return ;len+=snprintf(buff+len,100,"%d",root->key);if(root->lchild==NULL&&root->rchild==NULL)return ;len+=snprintf(buff+len,100,"(");__serial(root->lchild);if(root->rchild){len+=snprintf(buff+len,100,",");__serial(root->rchild);}len+=snprintf(buff+len,100,")");return ;
}void serial(Node* root)
{memset(buff,0,sizeof(buff));len=0;__serial(root);return ;
}void output(Node* root)
{if(root==NULL)return ;printf("%d(%d,%d)\n",key(root),key(root->lchild),key(root->rchild));output(root->lchild);output(root->rchild);
}Node* diserial(char buff[],int n)
{Node* root=NULL;Node* p=NULL;int top=-1,state=0,fag=0;Node** stack=(Node**)malloc(sizeof(Node*)*MAX_NODE);for(int i=0;i<n;i++){switch(state){case 0:{if(buff[i]<='9'&&buff[i]>='0')state=1;if(buff[i]=='(')state=2;if(buff[i]==',')state=3;if(buff[i]==')')state=4;i--;}break;case 1:{int key=0;while(buff[i]<='9'&&buff[i]>='0'){key=key*10+(buff[i]-'0');i++;}p=init_node(key);if(fag==0&&top>=0)stack[top]->lchild=p;if(fag==1&&top>=0)stack[top]->rchild=p;i--;state=0;}break;case 2:{stack[++top]=p;fag=0;state=0;}break;case 3:{fag=1;state=0;}break;case 4:{root=stack[top--];state=0;}break;}}free(stack);
return root;
}int main()
{srand((unsigned)time(0));Node* root=NULL;root=getnewtree(root,MAX_NODE);serial(root);output(root);printf("广义表为:\n");printf("%s\n",buff);Node* new_root=diserial(buff,len);printf("反序列化结果为:"\n);output(new_root);clear(root);clear(new_root);return 0;
}

二、结果

10(35,0)
35(41,2)
41(-1,25)
25(-1,-1)
2(-1,-1)
0(94,79)
94(65,-1)
65(-1,-1)
79(44,-1)
44(-1,-1)
广义表为:
10(35(41(,25),2),0(94(65),79(44)))
反序列化结果为:
10(35,0)
35(41,2)
41(-1,25)
25(-1,-1)
2(-1,-1)
0(94,79)
94(65,-1)
65(-1,-1)
79(44,-1)
44(-1,-1)

这篇关于二叉树的广义表反序列化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006160

相关文章

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.

Django序列化中SerializerMethodField的使用详解

《Django序列化中SerializerMethodField的使用详解》:本文主要介绍Django序列化中SerializerMethodField的使用,具有很好的参考价值,希望对大家有所帮... 目录SerializerMethodField的基本概念使用SerializerMethodField的

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字