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

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

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现echart大屏动画效果及全屏布局错乱解决方式

如何实现echarts动画效果?如何实现表格或多个垂直布局的柱状图自动滚动效果?如何解决tooltip位置超出屏幕问题,如何解决legend文字过长,布局错乱问题?如何处理饼图的中心图片永远居中? 本文将主要解决以上问题,如有错漏,请指正. 一、大屏动画效果 这里的动画效果主要指&…

【YashanDB知识库】如何处理yasql输入交互模式下单行字符总量超过限制4000字节

现象 在yasql执行sql语句后报错&#xff1a;YASQL-00021 input line overflow (>4000 byte at line 4) 原因 yasql在交互模式模式下单行字符总量限制4000字节&#xff0c;超出该限制即报错。 交互式模式下&#xff0c;yasql会显示一个提示符&#xff0c;通常是 SQL>…

DALL·E 2(内含扩散模型介绍)-生成式模型【学习笔记】

视频链接&#xff1a;DALLE 2&#xff08;内含扩散模型介绍&#xff09;【论文精读】_哔哩哔哩_bilibili&#xff08;up主讲的非常好&#xff0c;通俗易懂&#xff0c;值得推荐&#xff09; 目录 1、GAN模型 2、VAE模型 2.1、AE&#xff08;Auto-Encoder&#xff09; 2.2、…

FPGA 16 ,Verilog中的位宽:深入理解与应用

目录 前言 一. 位宽的基本概念 二. 位宽的定义方法 1. 使用向量变量定义位宽 ① 向量类型及位宽指定 ② 位宽范围及位索引含义 ③ 存储数据与字节数据 2. 使用常量参数定义位宽 3. 使用宏定义位宽 4. 使用[:][-:]操作符定义位宽 1. 详细解释 : 操作符 -: 操作符 …

使用 Vue3 实现摄像头拍照功能

参考资料:MediaDevices.getUserMedia() - Web API | MDN 重要: navigator.mediaDevices.getUserMedia 需要在安全的上下文中运行。现代浏览器要求摄像头和麦克风的访问必须通过 HTTPS 或 localhost&#xff08;被视为安全的本地环境&#xff09;进行,如果上传服务器地址是http…

2024安装hexo和next并部署到github和服务器最新教程

碎碎念 本来打算写点算法题上文所说的题目&#xff0c;结果被其他事情吸引了注意力。其实我之前也有过其他博客网站&#xff0c;但因为长期不维护&#xff0c;导致数据丢失其实是我懒得备份。这个博客现在部署在GitHub Pages上&#xff0c;github不倒&#xff0c;网站不灭&…

RTMP推流平台EasyDSS在无人机推流直播安防监控中的创新应用

无人机与低空经济的关系密切&#xff0c;并且正在快速发展。2024年中国低空经济行业市场规模达到5800亿元&#xff0c;其中低空制造产业占整个低空经济产业的88%。预计未来五年复合增速将达到16.03%。 随着科技的飞速发展&#xff0c;公共安防关乎每一个市民的生命财产安全。在…

java全栈day16--Web后端实战(数据库)

一、数据库介绍 二、Mysql安装&#xff08;自行在网上找&#xff0c;教程简单&#xff09; 安装好了进行Mysql连接 连接语法&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroot -p密码 方法二&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroo…

基于注意力的几何感知的深度学习对接模型 GAABind - 评测

GAABind 作者是苏州大学的生物基础与医学院, 期刊是 Briefings in Bioinformatics, 2024, 25(1), 1–14。GAABind 是一个基于注意力的几何感知蛋白-小分子结合模式与亲和力预测模型,可以捕捉小分子和蛋白的几何、拓扑结构特征以及相互作用。使用 PDBBind2020 和 CASF2016 作…

【CSS in Depth 2 精译_080】 13.1:CSS 渐变效果(中)——不同色彩空间的颜色插值算法在 CSS 渐变中的应用

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 13 章 渐变、阴影与混合模式】 ✔️ 13.1 渐变 ✔️ 13.1.1 使用多个颜色节点&#xff08;上&#xff09;13.1.2 颜色插值方法&#xff08;中&#xff09; ✔️13.1…

虚拟机VirtualBox安装最新版本Oracle数据库

https://www.oracle.com/database/technologies/databaseappdev-vm.html 如上所示&#xff0c;从Oracle官方网站上下载最新版本的VirtualBox虚拟机对应的Oracle数据库安装源文件。 如上所示&#xff0c;在VirtualBox中导入下载的Oracle安装源文件。 如上所示&#xff0c;导入…

热更新解决方案4——xLua热补丁

概述 运行时不在执行C#中的代码&#xff0c;而是执行Lua中的代码&#xff0c;相当于是打了个补丁。 1.第一个热补丁 2.多函数替换 3.协程函数替换 在原HotfixMain脚本中只加个协程函数即可&#xff08;和在Start中启动协程函数&#xff09; 4.索引器和属性替换 在HotfixMain中…

突破长链视觉推理瓶颈:Insight-V多智能体架构解析

GitHub 仓库&#xff1a;https://github.com/dongyh20/Insight-V HuggingFace 模型库&#xff1a;https://huggingface.co/THUdyh/Insight-V arXiv 技术论文&#xff1a;https://arxiv.org/pdf/2411.14432 模型&#xff1a;https://huggingface.co/THUdyh/Insight-V-Reason 今天…

IDEA 未启用lombok插件的Bug

项目中maven已引用了lombok依赖&#xff0c;之前运行没有问题的&#xff0c;但有时启动会提示&#xff1a; java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok support…

AI工具如何深刻改变我们的工作与生活

在当今这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经从科幻小说中的概念变成了我们日常生活中不可或缺的一部分。从智能家居到自动驾驶汽车&#xff0c;从医疗诊断到金融服务&#xff0c;AI正以惊人的速度重塑着我们的世界。 一、工作方式的革新…

压力测试Jmeter简介

前提条件&#xff1a;要安装JDK 若不需要了解&#xff0c;请直接定位到左侧目录的安装环节。 1.引言 在现代软件开发中&#xff0c;性能和稳定性是衡量系统质量的重要指标。为了确保应用程序在高负载情况下仍能正常运行&#xff0c;压力测试变得尤为重要。Apache JMeter 是一…

手眼标定工具操作文档

1.手眼标定原理介绍 术语介绍 手眼标定&#xff1a;为了获取相机与机器人坐标系之间得位姿转换关系&#xff0c;需要对相机和机器人坐标系进行标定&#xff0c;该标定过程成为手眼标定&#xff0c;用于存储这一组转换关系的文件称为手眼标定文件。 ETH&#xff1a;即Eye To …

vue 自定义组件image 和 input

本章主要是介绍自定义的组件&#xff1a;WInput&#xff1a;这是一个验证码输入框&#xff0c;自动校验&#xff0c;输入完成回调等&#xff1b;WImage&#xff1a;这是一个图片展示组件&#xff0c;集成了缩放&#xff0c;移动等操作。 目录 一、安装 二、引入组件 三、使用…

CTFHUB-web(SSRF)

内网访问 点击进入环境&#xff0c;输入 http://127.0.0.1/flag.php 伪协议读取文件 /?urlfile:///var/www/html/flag.php 右击查看页面源代码 端口扫描 1.根据题目提示我们知道端口号在8000-9000之间,使用bp抓包并进行爆破 POST请求 点击环境&#xff0c;访问flag.php 查看页…

Mysql 深度分页查询优化

Mysql 分页优化 1. 问题根源 问题&#xff1a; mysql在数据量大的时候&#xff0c;深度分页数据偏移量会增大&#xff0c;导致查询效率越来越低。 问题根源&#xff1a; 当使用 LIMIT 和 OFFSET 进行分页时&#xff0c;MySQL 必须扫描 OFFSET LIMIT 行&#xff0c;然后丢弃前…