数据结构学习笔记——广义表

目录

  • 一、广义表的定义
  • 二、广义表的表头和表尾
  • 三、广义表的深度和长度
  • 四、广义表与二叉树
    • (一)广义表表示二叉树
    • (二)广义表表示二叉树的代码实现

一、广义表的定义

广义表是线性表的进一步推广,是由n(n≥0)个数据元素组成的有限序列。线性表中的数据元素只能是单个元素(原子),它是不可分割的,而广义表中的数据元素既可以是原子,也可以是一个广义表(包括空表和非空表),广义表通过圆括号“()”括起来,通过逗号“,”隔开表中的各个数据元素。
在这里插入图片描述
一个n维数组可以看成元素是n-1维数组的广义表,广义表的元素都是n-1维数组。广义表满足线性表的特征,只是其中的元素是原子或广义表(子表),分别只有一个表头元素和表尾元素,表头元素有后继但是没有前驱,表尾元素有前驱但是没有后继,剩下每个元素都有唯一的前驱和后继。

二、广义表的表头和表尾

广义表是可以递归的,一个广义表也可以是其自身的子表,广义表中的第一个元素称为广义表的表头,而剩余数据元素组成的表称为广义表的表尾,广义表的表头和表尾可以看作通过函数head()和tail()对广义表操作。例如,已知广义表S=(((a)),(b),c,(a),(((d,e)))),通过head()和tail()取出元素e的操作如下:

head(tail(head(head(head(tail(tail(tail(tail(A)))))))))

任何一个非空广义表,表头可能是单个元素(原子)或广义表,但表尾只可能是广义表,其原因是广义表的取表尾tail()是非空广义表除去表头元素后,剩余元素组成的表,所以不可能是原子。
在这里插入图片描述
例如,C=(a,b,c,d,e,f,g),该广义表的表头是(a),表尾是(b,c,d,e,f,g);
例如,D=((a,b),((c,d,e),(f,g,h))),该广义表的表头是(a,b),表尾是((c,d,e),(f,g,h))。

另外,若一个广义表为空,则为一个空表。例如,E=( ),F=(( )),广义表E是一个空表,只有非空广义表才能取表头,广义表F的表头和表尾都是()。

三、广义表的深度和长度

  • 广义表的深度通过括号的层数求得,而长度是广义表中所含元素的个数。【深度层数,长度个数】

例如,一个空广义表G=(),括号层数为1,所以广义表的深度为1,而由于是空表,所以广义表的长度为0;
例如,一个广义表H=((a,b),(c,(d,e))),括号层数为3,所以广义表的深度为3,最高层为(c,(d,e)),逗号隔开了原子( c )和广义表( d,e ),元素个数为2,所以广义表的长度为2。
例如,一个广义表I=((),(a),(b,c,(d),((d,f)))),由于括号的最大层数为4,所以广义表的深度为4,可知广义表有三个元素,分别是()、(a)、(b,c,(d),((d,f))),元素个数为3,所以广义表的长度为3。
例如,设广义表J=(( ),( )),对广义表J,head(J)=( ),tail(J)=(( )),括号的最大层数为2,所以广义表的深度为2,广义表有两个元素,分别是()、(),元素个数为2,所以广义表长度为2。

注:这里的Tail(J)=(( )),而不是( )。

四、广义表与二叉树

(一)广义表表示二叉树

根据广义表中“ 数据元素既可以是原子,也可以是一个广义表(包括空表和非空表) ”这一点可以来表示二叉树,即通过(根结点,根结点的广义表)的形式来表示,其中可以嵌套。
例如,下面是一个满二叉树:
在这里插入图片描述
通过广义表表示该二叉树:
(A , ( B , ( D , E ) ) , ( C , ( F , G ) ) ) )
这个二叉树的解释如下:
根结点是A,它的左孩子是B,B的左孩子是D,B的右孩子是E。
根结点A的右孩子是C,C的左孩子是F,C的右孩子是G。

(二)广义表表示二叉树的代码实现

通过广义表来显示建立的二叉树,一个非空的二叉树T,当对于左孩子结点或右孩子结点时,此时输出一个左括号“(”,递归处理左子树,输出一个“,”用于隔开结点,然后递归处理右子树,输出一个右括号“)”,从而完成一个根结点以下的两个左/右结点处理,代码如下:

/*广义表输出二叉树*/
void ShowTree(BTree T) {if(T!=NULL) {//当二叉树不为空时printf("%c",T->data);	//输入出该结点的数据域if(T->lchild!=NULL) {		//若该结点的左子树不为空printf("(");	//输出一个左括号ShowTree(T->lchild);	//通过递归继续输出结点的左子树结点下的各结点if(T->rchild!=NULL) {	//若该结点右子树不为空printf(",");	//输出一个逗号ShowTree(T->rchild);	//通过递归继续输出结点的右子树结点下的各结点}printf(")");	//输出一个右括号} else {	//若左子树为空,右子树不为空if(T->rchild!=NULL) {printf("(");	//输出一个左括号ShowTree(T->lchild);	//通过递归继续输出结点的左子树结点下的各结点if(T->rchild!=NULL) {		//若该结点的右子树不为空	printf(",");	//输出一个逗号ShowTree(T->rchild);	//通过递归继续输出结点的右子树结点下的各结点}printf(")");	//输出一个右括号}}}
}

例如,一个二叉树如下图,通过链式存储结构实现建立二叉树并输出。
在这里插入图片描述
代码如下:

#include <stdio.h>
#include <malloc.h>
/*1、二叉树的定义*/
typedef struct BNode {int data;		//数据域struct BNode *lchild,*rchild;		//左孩子、右孩子指针
} *BTree;/*2、二叉树的建立*/
BTree CreateTree() {BTree T;char ch;scanf("%c",&ch);getchar();	//getchar()用于接收每次输入字符结点后的回车符,从而以便输入下一个字符结点if(ch=='0')	//当为0时,将结点置空T=NULL;else {T=(BTree)malloc(sizeof(BTree));	//分配一个新的结点T->data=ch;printf("请输入%c结点的左孩子结点:",T->data);T->lchild=CreateTree();		//通过递归建立左孩子结点printf("请输入%c结点的右孩子结点:",T->data);T->rchild=CreateTree();		//通过递归建立右孩子结点}return T;
}/*3、广义表输出二叉树*/
void ShowTree(BTree T) {if(T!=NULL) {//当二叉树不为空时printf("%c",T->data);	//输入出该结点的数据域if(T->lchild!=NULL) {		//若该结点的左子树不为空printf("(");	//输出一个左括号ShowTree(T->lchild);	//通过递归继续输出结点的左子树结点下的各结点if(T->rchild!=NULL) {	//若该结点右子树不为空printf(",");	//输出一个逗号ShowTree(T->rchild);	//通过递归继续输出结点的右子树结点下的各结点}printf(")");	//输出一个右括号} else {	//若左子树为空,右子树不为空if(T->rchild!=NULL) {printf("(");	//输出一个左括号ShowTree(T->lchild);	//通过递归继续输出结点的左子树结点下的各结点if(T->rchild!=NULL) {		//若该结点的右子树不为空	printf(",");	//输出一个逗号ShowTree(T->rchild);	//通过递归继续输出结点的右子树结点下的各结点}printf(")");	//输出一个右括号}}}
}/*主函数*/
int main() {BTree T;T=NULL;printf("请输入二叉树的根结点:");T=CreateTree();		//建立二叉树printf("建立的二叉树如下:\n");ShowTree(T);		//通过广义表显示二叉树
}

依次输入各个结点的左右孩子结点,若结点不存在则输入0,例如树中结点d的左孩子结点不存在,结点f、g、h、i、j的左右孩子都不存在,输入时都输入0。
运行结果如下,结果通过广义表的定义显示:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest自动化框架之allure测试报告的用例描述设置

allure测试报告的用例描述相关方法&#xff1b;如下图 allure标记用例级别severity 在做自动化测试的过程中&#xff0c;测试用例越来越多的时候&#xff0c;如果执行一轮测试发现了几个测试不通过&#xff0c;我们也希望能快速统计出缺陷的等级。 pytest结合allure框架可以对…

网络调试助手 连接Onenet 多协议接入平台 TCP透传协议

onenet文档链接 多协议接入地址 打开Onenet平台&#xff0c;多协议接入 选择TCP透传协议&#xff0c;点击添加产品&#xff0c;输入信息&#xff0c;点击确认 点击设备列表&#xff0c;添加设备 下面需要上传一个解析脚本文件该文件的下载地址lua文件下载地址 建立连接 设备…

接口测试 —— 接口测试的意义

1、接口测试的意义&#xff08;优势&#xff09; &#xff08;1&#xff09;更早的发现问题&#xff1a; 不少的测试资料中强调&#xff0c;测试应该更早的介入到项目开发中&#xff0c;因为越早的发现bug&#xff0c;修复的成本越低。 然而功能测试必须要等到系统提供可测试…

卷积神经网络(CNN):乳腺癌识别.ipynb

文章目录 一、前言一、设置GPU二、导入数据1. 导入数据2. 检查数据3. 配置数据集4. 数据可视化 三、构建模型四、编译五、训练模型六、评估模型1. Accuracy与Loss图2. 混淆矩阵3. 各项指标评估 一、前言 我的环境&#xff1a; 语言环境&#xff1a;Python3.6.5编译器&#xf…

智能优化算法应用:基于阿基米德优化算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于阿基米德优化算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于阿基米德优化算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.阿基米德优化算法4.实验参数设定5.算…

基础堆溢出原理与DWORD SHOOT实现

堆介绍 堆的数据结构与管理策略 程序员在使用堆时只需要做三件事情&#xff1a;申请一定大小的内存&#xff0c;使用内存&#xff0c;释放内存。 对于堆管理系统来说&#xff0c;响应程序的内存使用申请就意味着要在"杂乱"的堆区中"辨别"出哪些内存是正在…

2023年12月4日:多继承

代码 #include <iostream>using namespace std;class Sofa { private:string sit;int *len; public:Sofa(){cout << "Sofa::无参构造函数" << endl;}Sofa(string sit,int len):sit(sit),len(new int(len)){cout << "Sofa::有参构造函数…

堆的应用:堆排序

文章目录 前言堆排序的实现&#xff08;升序为例&#xff09;代码 前言 堆排序&#xff0c;顾名思义是一个利用堆来完成排序的一个操作。在之前&#xff0c;小编在[C语言学习系列–&#xff1e;【关于qsort函数的详解以及它的模拟实现】] 谈到冒泡排序&#xff0c;但是冒泡排序…

7. 系统信息与系统资源

7. 系统信息与系统资源 1. 系统信息1.1 系统标识 uname()1.2 sysinfo()1.3 gethostname()1.4 sysconf() 2. 时间、日期2.1 Linux 系统中的时间2.1.1 Linux 怎么记录时间2.1.2 jiffies 的引入 2.2 获取时间 time/gettimeofday2.2.1 time()2.2.2 gettimeofday() 2.3 时间转换函数…

登录校验过滤器

会话技术 JWT令牌 过滤器Filter 拦截器 interceptor cookise package com.it.controller;import com.it.pojo.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Re…

Golang 设置运行的cpu数与channel管道

介绍&#xff1a;为了充分了利用多cpu的优势&#xff0c;在Golang程序中&#xff0c;设置运行的cpu数目。 func main() {//获取系统当前cpu的数量num : runtime.NumCPU()//这里根据需求来设置整个go程序去使用几个cpuruntime.GOMAXPROCS(num)fmt.Println("num ", nu…

室内外融合便携式定位终端5G+UWB+RTK

一、介绍 便携式定位终端主要用于提供高精度的位置数据&#xff0c;支持室内UWB定位和室外北斗系统定位功能&#xff0c;支持5G公网和5G专网通信功能&#xff0c;便携式定位终端中超宽带(UWB)和实时动态(RTK)技术的集成代表了精确位置跟踪方面的重大进步。这款UWBRTK便携式定位…

Windows开启SQL Server服及1433端口

需求&#xff1a;Windows开启SQL Server服务及1433端口 目前端口没有启动 解决&#xff1a; 打开SQL Server配置管理器&#xff08;winR&#xff09; 各个sqlserver版本在textbox中输入对应的命令如下&#xff1a; SQLServerManager15.msc&#xff08;对于 SQL Server 2019 &am…

python获取阿里云云解析dns的域名解析记录

最近由于工作原因接触到阿里云的服务&#xff0c;我需要实时获取所有的域名信息&#xff0c;用于对其进行扫描&#xff0c;因此写了一个自动化爬取脚本 给需要的人分享。 &#xff08;阿里云有官方的demo&#xff0c;有兴趣的可以自己看一下&#xff0c;后面也会放链接&#xf…

高级/进阶”算法和数据结构书籍推荐

“高级/进阶”算法和数据结构书籍推荐《高级算法和数据结构》 高级算法和数据结构 为什么要选择本书 谈及为什么需要花时间学算法&#xff0c;我至少可以列举出三个很好的理由。 (1)性能&#xff1a;选择正确的算法可以显著提升应用程序的速度。仅就搜索来说&#xff0c;用二…

人工智能发展史

人工智能&#xff08;AI&#xff09;的发展史是一段跨越数十年的旅程&#xff0c;涵盖了从早期理论探索到现代技术革新的广泛内容。人工智能的发展历程展示了从最初的概念探索到现代技术突破的演变。尽管经历了多次起伏&#xff0c;但AI领域持续进步&#xff0c;不断拓展其应用…

2243:Knight Moves

文章目录 题目描述思路1. DFS2. BFS3. 动态规划 解题方法1. DFS2. BFS3. 动态规划 题目描述 题目链接 翻译如下&#xff1a; 注&#xff1a;骑士移动是和象棋里的马一样走的是日字型 你的一个朋友正在研究旅行骑士问题 &#xff08;TKP&#xff09;&#xff0c;你要找到最短的…

Android 断点调试

Android 调试 https://developer.android.google.cn/studio/debug?hlzh-cn 调试自己写的代码&#xff08;不在Android源码&#xff09; 点击 Attach debugger to Android process 图标 需要在添加断点界面手动输入函数名 但也可以不手动&#xff0c;有个技巧可以new 空proje…

个人博客搭建保姆级教程-HTML页面编写篇

选择模板 首先我们要选一个好的模板&#xff0c;然后对模板进行剪裁。我的模板是在站长之家进行下载的 素材下载-分享综合设计素材免费下载的平台-站长素材 我选的模板的具体地址是 个人博客资讯网页模板 这里需要我们学习一下在前边一篇文章里提到的HTML、JavaScript、CSS…

C++ :运算符重载

运算符重载&#xff1a; 运算符重载概念&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 运算符的重载实际是一种特殊的函数重载&#xff0c;必须定义一个函数&#xff0c;并告诉C编译器&#xff0c;当遇到该重载的运算符…