二叉树的序列化和反序列化

该博客介绍了如何使用先序遍历实现二叉树的序列化和反序列化,其中序列化是通过先序遍历产生一个包含空节点标记的字符序列,反序列化则是根据这个序列重建二叉树。代码展示了C语言实现的序列化和反序列化过程,包括创建、显示、销毁二叉树以及相关字符串操作的函数。
摘要由CSDN通过智能技术生成

/**
*    实验题目:
*        二叉树的序列化和反序列化
*    实验目的:
*        深入掌握二叉树的遍历和构造算法
*    实验内容:
*        设计程序,实现二叉树的序列化和反序列化。
*    介绍通过先序遍历实现二叉树的序列化和反序列化(也可以采用层次遍历
*    实现序列化和反序列化),假设二叉树每个结点值为单个字符(不含"#",这里
*    用"#"字符表示对应空结点。所谓序列化,就是对二叉树进行先序遍历产生
*    一个字符序列的过程,与一般先序遍历不同的是,还要记录空结点。
*       所谓反序列化,是通过先序序列化的结果串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;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值