数据结构 ——二叉树转广义表

news2025/3/1 4:07:42

数据结构 ——二叉树转广义表

1、树转广义表
如下一棵树,转换为广义表
在这里插入图片描述
root=(c(a()(b()()))(e(d()())(f()(j(h()())())))) (根(左子树)(右子树))

  • 代码实现
#include<stdio.h>
#include<stdlib.h>

//保存二叉树到文件
#define FNAME "../test16_save/out.txt"
#define NAMESIZE 32
struct node_st
{
    char data;
    struct node_st *l,*r;
};
struct node_st *tree=NULL;
//char型会存在不可预知的字符,不用它来传参
int insert(struct node_st **root,int data)
{
    struct node_st *node;
    //走到空节点或叶子节点
    if(*root==NULL)
    {
        node=(struct node_st*)malloc(sizeof(struct node_st));
        if(node==NULL)
            return -1;
        node->data=data;
        node->l=NULL;//防止野指针的出现
        node->r=NULL;
        *root=node;//根节点指向创建出来的新节点,后面递归时root为传入的左或右子树的指针
        return 0; 
    }
    //比当前节点小的插入左子树,比节点大的插入右子树,递归遍历
    if(data<=(*root)->data)
     return insert(&(*root)->l,data);
    return insert(&(*root)->r,data);
}
void draw_(struct node_st *root,int level)
{
    /*往左边倒,画出树的结构,先画当前节点的右子树,再跟节点,最后
      root->r
      root
      root->l
    */
   if(root==NULL)
       return; //空节点或空的叶子结点
   //先画右子树,右子树不止一层,所以递归调用,画右子树的右子树(当前层的下一层)
    draw_(root->r,level+1);
    //画空格,即当前节点前面的空格
    for(int i=0;i<level;i++)
        printf("  ");
    //画根节点
    printf("%c\n",root->data);
    //画左子树
    draw_(root->l,level+1);

}
void draw(struct node_st *root)
{
    //根据层数画出树和空格
    draw_(root,0);
}
//销毁二叉树,后序遍历思想:先销毁当前节点的左子树,再销毁当前节点的右子树,最后销毁当前节点
void destroy(struct node_st *root)
{
    if(root==NULL)
        return ;
    destroy(root->l);
    destroy(root->r);
    free(root);
}
//保存为广义表的形式,(根(左子树)(右子树))
int save_(struct node_st *root,FILE *fp)
{
    fputc('(',fp);
    //为空,或走到叶子结点
    if(root ==NULL)
    {
        fputc(')',fp);
        return 0;
    }
    //不为空,把根节点打印出来
    fputc(root->data,fp);
    //递归保存左子树
    save_(root->l,fp);
    //递归保存右子树
    save_(root->r,fp);
    fputc(')',fp);
    return 0;
}
int save(struct node_st *root,const char *path)
{
    FILE *fp=fopen(path,"w");
    if(fp==NULL)
    {
        printf("open file %s failed\n",path);
        return -1;
    }
    // save_(root,fp);
    save_(tree,fp);
    fclose(fp);
    return 0;
}
int main()
{
    char arr[]="cefadjbh";
    int i;
    for(i=0;i<sizeof(arr)/sizeof(arr[0])-1;i++) //-1是为了去掉最后一个'\0'
    {
        //无头节点要改变指针的指向,传二级指针
        insert(&tree,arr[i]);
    }
    draw(tree);
    save(tree,FNAME);
    destroy(tree);
    return 0;
}

2、根据广义表画出二叉树
假设广义表为 (c(a()(b()()))(e(d()())(f()(j(h()())())))) 画出该二叉树
实现过程:先拿到表的第一个字符,判断是不是(,是的话继续拿第二个字符,不是)的话,则为根节点,保存该根节点数据;继续左右子树的递归存值,读完左右子树后,继续读最后一个),递归结束,返回这棵树。

  • 代码实现
#include<stdio.h>
#include<stdlib.h>

#define FNAME "../test16_save/out.txt"
#define NAMESIZE 32
struct node_st
{
    char data;
    struct node_st *l,*r;
};
void draw_(struct node_st *root,int level)
{
    /*往左边倒,画出树的结构,先画当前节点的右子树,再跟节点,最后
      root->r
      root
      root->l
    */
   if(root==NULL)
    {
     //   printf("Empty node at level %d\n", level);  // Debug output
        return;
    }
   //先画右子树,右子树不止一层,所以递归调用,画右子树的右子树(当前层的下一层)
    draw_(root->r,level+1);
    //画空格,即当前节点前面的空格
    for(int i=0;i<level;i++)
        printf("  ");
    //画根节点
    printf("%c\n",root->data);
    //画左子树
    draw_(root->l,level+1);

}
void draw(struct node_st *root)
{
    //根据层数画出树和空格
    printf("draw tree:\n");
    draw_(root,0);
}
struct node_st *load_(FILE *fp)
{
    int c;
    struct node_st *root;
    c=fgetc(fp);
    //读到的第一个一定是(,不是说明文件有问题
    if(c!='(')
    {
        fprintf(stderr,"fgetc():error\n");
        exit(1);
    }
    c=fgetc(fp);
    //读完( 后,继续读到),说明树为空
    if(c==')')
        return NULL;
    //读到根节点,保存到root中
    root=malloc(sizeof(*root));
    if(root==NULL)
    {
        fprintf(stderr,"malloc():error\n");
        exit(1);
    }
    root->data=c;
    //继续读左右子树
    root->l=load_(fp);
    root->r=load_(fp);
    //读完左右子树后,继续读最后一个)
    c=fgetc(fp);
    if(c!=')')
    {
        fprintf(stderr,"fgetc():error\n");
        return NULL;
    }
    return root;  
}
struct node_st *load(const char *path)
{
    FILE *fp;
    fp=fopen(path,"r");
    struct node_st *root;
    if(fp==NULL)
    {
        printf("open file %s failed\n",path);
        return NULL;
    }
    root=load_(fp);
    fclose(fp);
    return root;
}

int main()
{
    struct node_st *root;
    root=load(FNAME);
    draw(root);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能大语言模型起源篇(二),从通用语言微调到驾驭LLM

上一篇&#xff1a;《人工智能大语言模型起源篇&#xff08;一&#xff09;&#xff0c;从哪里开始》 &#xff08;5&#xff09;Howard 和 Ruder 于2018年发表的《Universal Language Model Fine-tuning for Text Classification》&#xff0c;https://arxiv.org/abs/1801.06…

设置笔记本同时连接内外网

原理&#xff1a;通过笔记本和手机相连&#xff0c;实现双网卡功能能。笔记本连接内网wifi、同时手机端开启usb网络共享&#xff0c;笔记本就有了两个网&#xff0c;然配置那个访问外网&#xff0c;那个访问内网。 1.笔记本wifi连接内网wifi 2.手机端共享网络。 手机打开 -【…

【Hexo】Hexo基本使用

Hexo官网&#xff1a;https://hexo.io/ Hexo Github: https://github.com/hexojs/hexo Hexo Awesome: https://github.com/hexojs/awesome-hexo 1、初始化 需要node 环境&#xff0c;不再赘述node安装过程 推荐使用cnpm进行安装 npm install -g cnpm --registryhttps://regi…

PPO系列4 - Reward模型训练

流程&#xff1a; 训练Reward模型 训练数据&#xff1a; 相比给每条回答进行打分&#xff0c;人类更容易给出两者的比较结果。这样标注出来的数据&#xff0c;准确性更高。 模型&#xff1a; 可以使用和生成模型能力差不多的模型&#xff08;或者更强的模型&#xff09;&#x…

5.11如何用PyTorch实现ResNet34

ResNet34是由16个残差块和一个全局平局池化层和一个全连接层组成&#xff0c;即32个卷积层1个pooling层1和fc层。 训练的数据集是cifar10数据集&#xff0c;训练次数5&#xff0c;损失函数为CrossEntropyLoss()&#xff0c;optimizer torch.optim.SGD。 1.先定义残差块&#…

yolov,coco,voc标记的睡岗检测数据集,可识别在桌子上趴着睡,埋头睡觉,座椅上靠着睡,平躺着睡等多种睡姿的检测,6549张图片

yolov&#xff0c;coco,voc标记的睡岗检测数据集&#xff0c;可识别在桌子上趴着睡&#xff0c;埋头睡觉&#xff0c;座椅上靠着睡&#xff0c;平躺着睡等多种睡姿的检测&#xff0c;6549张图片 数据集分割 6549总图像数 训练组91&#xff05; 5949图片 有效集9&#x…

【C++游记】string的使用和模拟实现

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…

【深度学习量化交易7】miniQMT快速上手教程案例集——使用xtQuant进行历史数据下载篇

我是Mr.看海&#xff0c;我在尝试用信号处理的知识积累和思考方式做量化交易&#xff0c;应用深度学习和AI实现股票自动交易&#xff0c;目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统。 在前几篇的文章中讲到&#xff0c;我正在开发的看海量化交易系统&#x…

相差不超过k的最多数,最长公共子序列(一),排序子序列,体操队形,青蛙过河

相差不超过k的最多数 链接:相差不超过k的最多数 来源&#xff1a;牛客网 题目描述&#xff1a; 给定一个数组&#xff0c;选择一些数&#xff0c;要求选择的数中任意两数差的绝对值不超过 &#x1d458; 。问最多能选择多少个数&#xff1f; 输入描述: 第一行输入两个正整…

解决navicat 导出excel数字为科学计数法问题

一、原因分析 用程序导出的csv文件&#xff0c;当字段中有比较长的数字字段存在时&#xff0c;在用excel软件查看csv文件时就会变成科学技术法的表现形式。 其实这个问题跟用什么语言导出csv文件没有关系。Excel显示数字时&#xff0c;如果数字大于12位&#xff0c;它会自动转化…

C++3--内联函数、auto

1.内联函数 1.1概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序的效率 如果在上述函数前增加inline关键字将其改成内联函数&#xff0c;在编译期间编译器会用函…

AES 与 SM4 加密算法:深度解析与对比

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

视频怎么转音频mp3?5种视频转音频的方法

在视频剪辑时&#xff0c;将视频中的音频提取出来并转换为MP3格式已成为许多人的需求。无论是为了制作音乐播放列表、剪辑音频片段&#xff0c;还是为了在其他设备上更方便地播放&#xff0c;将视频转换为音频MP3都显得尤为重要。下面将介绍五种实用的方法&#xff0c;帮助你轻…

Maven学习(传统Jar包管理、Maven依赖管理(导入坐标)、快速下载指定jar包)

目录 一、传统Jar包管理。 &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;传统的Jar包导入方法。 1、手动寻找Jar包。并放置到指定目录下。 2、使用IDEA的库管理功能。 3、配置环境变量。 &#xff08;3&#xff09;传统的Jar包管理缺点。 二、Maven。 &#…

【机器学习】分类器

在机器学习(Machine Learning&#xff0c;ML)中&#xff0c;分类器泛指算法或模型&#xff0c;用于将输入数据分为不同的类别或标签。分类器是监督学习的一部分&#xff0c;它依据已知的数据集中的特征和标签进行训练&#xff0c;并根据这些学习到的知识对新的未标记数据进行分…

uni-app在image上绘制点位并回显

在 Uni-app 中绘制多边形可以通过使用 Canvas API 来实现。Uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;同时支持编译为 H5、小程序等多个平台。由于 Canvas 是 H5 和小程序中都支持的 API&#xff0c;所以通过 Canvas 绘制多边形是一个比较通用的方法。 1.…

【机器学习与数据挖掘实战】案例01:基于支持向量回归的市财政收入分析

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支&#xff0c;专注于让计算机系统通过数据学习和改进。它利用统计和计算方法&#xff0c;使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…

Spire.PDF for .NET【页面设置】演示:向 PDF 文档添加页码

在 PDF 文档中添加页码不仅实用&#xff0c;而且美观&#xff0c;因为它提供了类似于专业出版材料的精美外观。无论您处理的是小说、报告还是任何其他类型的长文档的数字副本&#xff0c;添加页码都可以显著提高其可读性和实用性。在本文中&#xff0c;您将学习如何使用Spire.P…

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)

目录 ARC规则 概要 所有权修饰符 __strong修饰符 __weak修饰符 __unsafe_unretained修饰符 __autoreleasing修饰符 ARC规则 概要 “引用计数式内存管理”的本质部分在ARC中并没有改变&#xff0c;ARC只是自动地帮助我们处理“引用计数”的相关部分。 在编译单位上可以…

An error happened while trying to locate the file on the Hub and we cannot f

An error happened while trying to locate the file on the Hub and we cannot find the requested files in the local cache. Please check your connection and try again or make sure your Internet connection is on. 关于上述comfy ui使用control net预处理器的报错问…