当前位置: 首页 > news >正文

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

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

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->rrootroot->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->rrootroot->l*/if(root==NULL){//   printf("Empty node at level %d\n", level);  // Debug outputreturn;}//先画右子树,右子树不止一层,所以递归调用,画右子树的右子树(当前层的下一层)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;
}

相关文章:

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

数据结构 ——二叉树转广义表 1、树转广义表 如下一棵树&#xff0c;转换为广义表 root(c(a()(b()()))(e(d()())(f()(j(h()())())))) (根&#xff08;左子树&#xff09;&#xff08;右子树&#xff09;) 代码实现 #include<stdio.h> #include<stdlib.h>//保存…...

chattts生成的音频与字幕修改完善,每段字幕对应不同颜色的视频,准备下一步插入视频。

上一节中&#xff0c;实现了先生成一个固定背景的与音频长度一致的视频&#xff0c;然后插入字幕。再合并成一个视频的方法。 但是&#xff1a;这样有点单了&#xff0c;所以&#xff1a; 1.根据字幕的长度先生成视频片断 2.在片段上加上字幕。 3.合并所有片断&#xff0c;…...

数据结构开始——时间复杂度和空间复杂度知识点笔记总结

好了&#xff0c;经过了漫长的时间学习c语言语法知识&#xff0c;现在我们到了数据结构的学习。 首先&#xff0c;我们得思考一下 什么是数据结构&#xff1f; 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素…...

路由策略与策略路由

路由策略 常用有Router-Policy&#xff0c;Filter-Policy等 控制路由是否可达&#xff0c;通过修改路由条目相关参数影响流量的转发 基于控制平面&#xff0c;会影响路由表表项&#xff0c;但只能基于目地址进行策略判定&#xff0c;于路由协议相结合使用 Router-Policy …...

pytorch_fid 安装笔记

目录 torch安装&#xff1a; pytorch_fid安装 torch安装&#xff1a; pip install torch2.5.0 --index-url https://download.pytorch.org/whl/cu121 pytorch_fid安装 pip install pytorch_fid 安装后&#xff0c;torch也会自动安装&#xff0c;导致torch引用报错。...

Qt绘制仪表————附带详细说明和代码示例

文章目录 1 效果2 原理3 编码实践3.1 创建仪表属性类3.2 设置类属性3.3 绘制图案3.3.1 设置反走样3.3.2 绘制背景3.3.3 重新定义坐标原点3.3.4 绘制圆环3.3.5 绘制刻度线3.3.6 绘制刻度线上的描述值3.3.7 绘制指针3.3.8 绘制指针数值和单位3.3.9 控制指针变化 扩展福利参考 1 效…...

百度地图JavaScript API核心功能指引

百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口&#xff0c;它能够帮助您在网站中构建功能丰富、交互性强的地图应用&#xff0c;包含了构建地图基本功能的各种接口&#xff0c;提供了诸如本地搜索、路线规划等数据服务。百度地图JavaScript API支持HTTP和HT…...

mp4影像和m4a音频无损合成视频方法

第一步&#xff1a;复制高清视频地址 url 第二步:打开网址粘贴复制的视频url视频下载 第三步&#xff1a;下载-影像.mp4和-音频.m4a 第四步&#xff1a;合并视频&#xff1b; 使用ffmpeg进行无损合成&#xff08;如果没有安装ffmpeg请自行下载安装下载 FFmpeg (p2hp.com)&…...

Ubuntu下将Julia嵌入Jupyter内核

一.安装 Julia 如果 Julia 尚未安装&#xff1a; 打开终端&#xff0c;下载最新的 Julia 安装包&#xff1a; wget https://julialang-s3.julialang.org/bin/linux/x64/1.9/julia-1.9.3-linux-x86_64.tar.gz 解压并移动到 /opt&#xff1a; tar -xvzf julia-1.9.3-linux-x86_…...

openGauss开源数据库实战二十五

文章目录 任务二十五 openGauss 数据库的物理备份与恢复任务目标实施步骤一、为进行物理备份做准备1.确保数据库工作在归档模式2.创建保存数据库物理备份的目录3.创建保存归档日志备份的目录 二、进行openGauss数据库的物理备份1.备份数据库2.切换WAL3.备份归档日志 三、openGa…...

[C/C++] List相关操作

List相关操作 1 链表二分 目标&#xff1a; &#xff08;1&#xff09;对于偶数节点&#xff0c;正好对半分&#xff1b; &#xff08;2&#xff09;对于奇数节点&#xff0c;前 后 1 &#xff08;3&#xff09;断开链表&#xff0c;方便后期合并 // 使用快慢指针完成中点…...

继电器控制与C++编程:实现安全开关控制的技术分享

在现代生活中,继电器作为一种重要的电气控制元件,在电气设备的安全控制中起到了至关重要的作用。通过低电流控制高电流,继电器能够有效地隔离控制电路与被控设备,从而保障使用者的安全。本项目将介绍如何通过树莓派Pico与继电器模块结合,使用C++编程实现继电器的控制。 一…...

题解 - 找子序列(2024.12上海月赛丙组T4)

题目描述 Dave 有一个长度为 n 的非负整数序列 a1-n, 和一个非负整数 m 。 他希望知道是否有一个 a 的非空子序列&#xff0c;使得子序列中所有元素的按位与(bitwise AND)结果为 m。 换言之&#xff0c;他想知道是否存在一个下标序列 i1-k(k ≥ 1),满足 1 ≤ i1 < i2 < …...

在centos 7.9上面安装mingw交叉编译工具

1.说明 为了在centos上面编译windows的程序&#xff0c;需要安装mingw工具&#xff0c;mingw工具是可以编译windows程序的一些工具链&#xff0c;使用方式和linux一致 2.下载脚本 使用脚本方式编译&#xff0c;github的脚本位置&#xff1a;https://github.com/Zeranoe/ming…...

ubuntu wine mobaxterm找不到串口和解决方案

安装好 打开MobaXterm时发现&#xff0c;没有可供选择的串口 我们再检查wine设备映射 ls -la ~/.wine/dosdevices/ 串口是存在的&#xff0c;我们再来一番神操作&#xff0c;并没有回滚操作&#xff0c;不知是否是必要修改 打开 注册表&#xff0c;在HKEY_LOCAL_MACHINE中的…...

如何编译安装系统settings设置应用(5.0.0-Release)

本文介绍如何在OpenHarmony 5.0.0 r版本中修改系统设置应用&#xff0c;并且编译安装到开发板上 开发环境 1.dayu200开发板 2.OpenHarmony 5.0.0r 固件 3.API12 full sdk &#xff08;如果安装full sdk过程中出现报错hvigor ERROR: Cannot find module typescript,请参考 h…...

<项目代码>YOLOv8 车牌识别<目标检测>

项目代码下载链接 &#xff1c;项目代码&#xff1e;YOLOv8 车牌识别&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90121387YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题…...

协同办公软件新升级:细节优化,让办公更简单

细节决定成败&#xff0c;企业酷信协同办公系统通过贴近客户实际需求的一系列改进和创新&#xff0c;在技术架构、系统结构、管理理念和使用性能上&#xff0c;都达到了国内先进水平&#xff0c;同时具备独特的优势。让我们看看企业酷信是如何通过这些细节提升&#xff0c;为企…...

【原创学习笔记】西门子1200 PLC实现变频器控制

一、实现的功能及应用的场合 通过PLC的不同指令&#xff0c;发送指令控制电机的启停和速度大小 二、硬件配置 1、西门子1214 PLC 2.TIA V16 3.SINAMICS G120C 三、实现功能步骤 1.添加设备G120C PN-调整以太网地址 根据实际情况选择有无滤波器&#xff0c;电机参数&#xf…...

SQL server学习02-使用T-SQL创建数据库

目录 一&#xff0c; 使用T-SQL创建数据库 1&#xff0c;数据库的存储结构 2&#xff0c;创建数据库的语法结构 1&#xff09;使用T-SQL创建学生成绩管理数据库 二&#xff0c;使用T-SQL修改数据库 1&#xff0c;修改数据库的语法结构 1&#xff09;修改学生成绩管理数…...

Wireshark蓝牙协议抓包实战:从环境搭建到数据解析

1. 环境准备&#xff1a;硬件与软件双管齐下 搞蓝牙协议分析就像侦探破案&#xff0c;没有趁手的工具可不行。我去年调试智能手环时&#xff0c;就因为没配好环境浪费了两天时间。咱们先从必备装备说起&#xff1a; 硬件三件套缺一不可&#xff1a; nRF52840 Dongle&#xff1a…...

超越wx.uploadFile!小程序多图上传终极方案:自定义FormData+后端接收详解

小程序多图上传实战&#xff1a;从FormData封装到企业级解决方案 在小程序开发中&#xff0c;文件上传是常见的业务场景&#xff0c;但原生wx.uploadFile接口在复杂需求面前往往力不从心。当我们需要批量上传、进度监控、自定义请求头时&#xff0c;一套完整的自定义上传方案就…...

电容是什么?一个“快充快放”的微型充电宝氯

一、前言&#xff1a;什么是 OFA VQA 模型&#xff1f; OFA&#xff08;One For All&#xff09;是字节跳动提出的多模态预训练模型&#xff0c;支持视觉问答、图像描述、图像编辑等多种任务&#xff0c;其中视觉问答&#xff08;VQA&#xff09;是最常用的功能之一——输入一张…...

Cosmos-Reason1-7B惊艳推理展示:从问题输入到结构化思考再到答案生成

Cosmos-Reason1-7B惊艳推理展示&#xff1a;从问题输入到结构化思考再到答案生成 获取更多AI镜像 想探索更多AI镜像和应用场景&#xff1f;访问 CSDN星图镜像广场&#xff0c;提供丰富的预置镜像&#xff0c;覆盖大模型推理、图像生成、视频生成、模型微调等多个领域&#xff0…...

QTableWidget 表格组件掖

7.1 初识三维模型 7.1.1 三维模型的数据载体 随着计算机图形技术的发展&#xff0c;我们或多或少都会见过或者听说过三维模型。笔者始终记得小时候第一次在电视上看到三维动画《变形金刚&#xff1a;超能勇士》的震撼感受&#xff1b;而现在我们已经可以在手机上玩三维游戏《王…...

Windows电脑突然变卡?手把手教你排查Artemis僵尸网络(附注册表修复脚本)

Windows系统异常卡顿&#xff1f;可能是Artemis僵尸网络在作祟 最近电脑突然变得异常缓慢&#xff0c;任务管理器打不开&#xff0c;甚至文件夹选项也消失了&#xff1f;这可能是Artemis僵尸网络在背后捣鬼。作为一名长期与Windows系统打交道的技术顾问&#xff0c;我见过太多用…...

边缘场景下.NET 9 GC策略终极调优:从Server GC到Single-Object Heap(SOH)迁移的7个致命陷阱与修复清单

第一章&#xff1a;边缘场景下.NET 9 GC演进全景与SOH引入动因在资源受限、低延迟敏感的边缘计算环境中&#xff0c;.NET 运行时面临前所未有的内存管理挑战&#xff1a;设备内存通常仅数百MB&#xff0c;CPU核心数少且无稳定供电&#xff0c;传统GC策略易引发长暂停与内存碎片…...

ElementUI MessageBox换行显示错误信息实战:Vue项目中的封装与应用

ElementUI MessageBox换行显示错误信息实战&#xff1a;Vue项目中的封装与应用 在Vue项目开发中&#xff0c;优雅地展示错误信息是提升用户体验的重要环节。ElementUI作为流行的Vue组件库&#xff0c;其MessageBox组件常用于系统提示&#xff0c;但默认情况下无法直接展示多行文…...

Sonic云真机平台二次开发指南:自定义插件与扩展开发

Sonic云真机平台二次开发指南&#xff1a;自定义插件与扩展开发 【免费下载链接】sonic-server &#x1f389;Back end of Sonic cloud real machine platform. Sonic云真机平台后端服务。 项目地址: https://gitcode.com/gh_mirrors/so/sonic-server Sonic云真机平台是…...

突破音乐加密壁垒:Unlock Music实现音频自由的完整指南

突破音乐加密壁垒&#xff1a;Unlock Music实现音频自由的完整指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: http…...