/**
* 实验题目:
* 二叉树的序列化和反序列化
* 实验目的:
* 深入掌握二叉树的遍历和构造算法
* 实验内容:
* 设计程序,实现二叉树的序列化和反序列化。
* 介绍通过先序遍历实现二叉树的序列化和反序列化(也可以采用层次遍历
* 实现序列化和反序列化),假设二叉树每个结点值为单个字符(不含"#",这里
* 用"#"字符表示对应空结点。所谓序列化,就是对二叉树进行先序遍历产生
* 一个字符序列的过程,与一般先序遍历不同的是,还要记录空结点。
* 所谓反序列化,是通过先序序列化的结果串str构建对应的二叉树,其过程:
* 用i从头到尾扫描str,采用先序方法,当i超界时返回NULL;否则遇到"#"字符,
* 返回NULL,当遇到其他字符时,创建一个结点,然后递归构造其左右子树。
* 实现上述过程,完成如下功能:
* 1、创建二叉链b
* 2、采用括号表示输出二叉链b
* 3、对二叉链b进行先序遍历,产生先序序列化序列str
* 4、输出串str
* 5、由str构建二叉链b1(反序列化)
* 6、采用括号表示输出二叉链b1
* 7、销毁二叉链b和b1
*/
#include <stdio.h>
#include <malloc.h>
#define MAX_SIZE 100
typedef char ElemType;
typedef struct node
{
ElemType data; // 数据元素
struct node *lchild; // 指向左孩子结点
struct node *rchild; // 指向右孩子结点
}BTNode; // 声明二叉链结点类型
typedef struct
{
char data[MAX_SIZE]; // 串中字符
int length; // 串长
}SqString; // 声明顺序串类型
/*-------------由括号表示串str创建二叉链b-----------------*/
static void create_btree(BTNode *&b, char *str) // 创建二叉树(形参b:指针的引用)
{
BTNode *p;
BTNode *St[MAX_SIZE]; // 定义一个顺序栈
int k;
int j = 0;
int top = -1; // 栈顶指针初始化
char ch;
b = NULL; // 建立的二叉树初始时为空
ch = str[j]; // 取第一个字符
while(ch != '\0') // str未扫描完时循环
{
switch(ch)
{
case '(': // 开始处理左子树
top++;
St[top] = p;
k = 1;
break;
case ')': // 子树处理完毕
top--;
break;
case ',': // 开始处理右子树
k = 2;
break;
default:
p = (BTNode *)malloc(sizeof(BTNode)); // 动态分配结点p的存储空间
p->data = ch;
p->lchild = p->rchild = NULL;