【头歌】二叉树的顺序存储及基本操作

news2024/10/7 10:15:32

第1关:树和二叉树基本概念

任务描述

本关任务:根据所学树和二叉树的基本概念等相关知识,完成右侧的选择题。

相关知识

树的定义

从数据结构角度看,树包含n(n≥0)个结点,当n=0时,称为空树;非空树的定义如下:  
T=(D,R) 其中,D为树中结点的有限集合,关系R满足以下条件:

  • 有且仅有一个结点d0∈D,它对于关系R来说没有前驱结点,结点d0称作树的根结点
  • 除根结点d0外,D中的每个结点有且仅有一个前驱结点,但可以有多个后继结点。
  • D中可以有多个终端结点。

【例】 有一棵树T=(D,R),其中  D={A,B,C,D,E,F,G,H},  R={r}  r={<A,B>,<A,C>,<A,D>,<C,E>,<C,F>,<D,G>,<E,H>} 画出其逻辑结构图。

解:A是根结点,其余结点分成三个互不相交的子集:   T1={B},T2={C,E,F,H},T3={D,G}。 T1、T2、T3都是根结点A的子树,且各自本身也是一棵树。

 树的定义

说明:树中结点之间的关系应为有向关系,在上图中,结点之间的连线即分支线都是有向的,默认箭头向下的。

树的基本术语

**结点的度:**树中每个结点具有的子树数或者后继结点数称为该结点的度。

 结点的度

树的度: 树中所有结点的度的最大值称之为树的度。  树的度

分支结点: 度大于0的结点称为分支结点或非终端结点。度为1的结点称为单分支结点,度为2的结点称为双分支结点,依次类推。  分支结点

叶子结点(或叶结点): 度为零的结点称为叶子结点或终端结点。  叶子结点

孩子结点: 一个结点的后继称之为该结点的孩子结点。  孩子结点

双亲结点(或父亲结点): 一个结点称为其后继结点的双亲结点。  双亲结点

子孙结点: 一个结点的子树中除该结点外的所有结点称之为该结点的子孙结点。  子孙结点

祖先结点: 从树根结点到达某个结点的路径上通过的所有结点称为该结点的祖先结点(不含该结点自身)。  祖先结点

兄弟结点: 具有同一双亲的结点互相称之为兄弟结点。  兄弟结点

结点层次: 树具有一种层次结构,根结点为第一层,其孩子结点为第二层,如此类推得到每个结点的层次。  结点层次

树的高度: 树中结点的最大层次称为树的高度或深度。  树的高度

森林: 零棵或多棵互不相交的树的集合称为森林。  森林

树的运算

树的运算主要分为三大类:

  1. 查找满足某种特定关系的结点,如寻找当前结点的双亲结点等;
  2. 插入或删除某个结点,如在树的当前结点上插入一个新结点或删除当前结点的第i个孩子结点等;
  3. 遍历树中每个结点。

二叉树的定义

二叉树的递归定义:

  • 二叉树或者是一棵空树。
  • 或者是一棵由一个根结点和两棵互不相交的分别称做根结点的左子树和右子树所组成的非空树,左子树和右子树又同样都是一棵二叉树。

 二叉树的逻辑示意图

二叉树与度为2的树的区别:

  • 度为2的树至少有3个结点,而二叉树的结点数可以为0。
  • 度为2的树不区分子树的次序,而二叉树中的每个结点最多有两个孩子结点,且必须要区分左右子树,即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树。

二叉树的5种形态:  二叉树的五种形态

二叉树的性质

性质1 非空二叉树上叶结点数等于双分支结点数加1。即n0=n2+1。 约定:二叉树上叶结点数为n0,单分支结点数为n1,双分支结点数为n2,

性质2 非空二叉树上第i层上至多有 2i−1 个结点,这里应有i≥1。

性质3 高度为h的二叉树至多有2h−1个结点(h≥1)。

满二叉树:在一棵二叉树中,当第i层的结点数为2i−1个时,则称此层的结点数是满的,当一棵二叉树中的每一层都满时,且叶子结点在同一层上,则称此树为满二叉树。

满二叉树特性:

  1. 除叶子结点以外的其他结点的度皆为2。
  2. 高度为h的满二叉树中的结点数为2h−1个。
  3. 层序编号:从根结点为1开始,按照层次从小到大、同一层从左到右的次序顺序编号。可以对满二叉树的结点进行连续编号。

 满二叉树编号

完全二叉树:在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干个结点,则称此树为完全二叉树。

完全二叉树特性:

  1. 完全二叉树中至多只有最下边两层结点的度数小于2。
  2. 高度为h的完全二叉树若按层序编号,它与高度为h的满二叉树中结点的编号一一对应。

如下图所示的一棵完全二叉树,它与等高度的满二叉树相比,在最后一层的右边缺少了3个结点。

 完全二叉树编号

性质4 对完全二叉树中编号为i的结点(1≤i≤n,n≥1,n为结点数)有: (1)若 i⩽└2n┘,即2i≤n,则编号为i的结点为分支结点,否则为叶子结点。 (2)若n为奇数,则每个分支结点都既有左孩子结点,也有右孩子结点; 若n为偶数,则编号最大的分支结点只有左孩子结点,没有右孩子结点,其余分支结点都有左、右孩子结点。 (3)若编号为i的结点有左孩子结点,则左孩子结点的编号为2i;若编号为i的结点有右孩子结点,则右孩子结点的编号为(2i+1)。 (4)除树根结点外,若一个结点的编号为i,则它的双亲结点的编号为 └2i┘,也就是说,当i为偶数时,其双亲结点的编号为2i,它是双亲结点的左孩子结点,当i为奇数时,其双亲结点的编号为2i−1,它是双亲结点的右孩子结点。  二叉树性质5

编程要求

根据提示,完成单选题。


开始你的任务吧,祝你成功!

实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第2关:二叉树的顺序存储及基本操作

任务描述

本关任务:以顺序结构存储二叉树,编写前序、中序、后序及层次顺序遍历二叉树的算法,并计算二叉树深度、所有结点总数。

相关知识

二叉树的定义

二叉树的递归定义:

  • 二叉树或者是一棵空树。
  • 或者是一棵由一个根结点和两棵互不相交的分别称做根结点的左子树和右子树所组成的非空树,左子树和右子树又同样都是一棵二叉树。

 二叉树的逻辑示意图

二叉树与度为2的树的区别:

  • 度为2的树至少有3个结点,而二叉树的结点数可以为0。
  • 度为2的树不区分子树的次序,而二叉树中的每个结点最多有两个孩子结点,且必须要区分左右子树,即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树。

二叉树的5种形态:  二叉树的五种形态

二叉树的性质

性质1 非空二叉树上叶结点数等于双分支结点数加1。即n0=n2+1。 约定:二叉树上叶结点数为n0,单分支结点数为n1,双分支结点数为n2,

性质2 非空二叉树上第i层上至多有 2i−1 个结点,这里应有i≥1。

性质3 高度为h的二叉树至多有2h−1个结点(h≥1)。

满二叉树:在一棵二叉树中,当第i层的结点数为2i−1个时,则称此层的结点数是满的,当一棵二叉树中的每一层都满时,且叶子结点在同一层上,则称此树为满二叉树。

满二叉树特性:

  1. 除叶子结点以外的其他结点的度皆为2。
  2. 高度为h的满二叉树中的结点数为2h−1个。
  3. 层序编号:从根结点为1开始,按照层次从小到大、同一层从左到右的次序顺序编号。可以对满二叉树的结点进行连续编号。

 满二叉树编号

完全二叉树:在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干个结点,则称此树为完全二叉树。

完全二叉树特性:

  1. 完全二叉树中至多只有最下边两层结点的度数小于2。
  2. 高度为h的完全二叉树若按层序编号,它与高度为h的满二叉树中结点的编号一一对应。

如下图所示的一棵完全二叉树,它与等高度的满二叉树相比,在最后一层的右边缺少了3个结点。

 完全二叉树编号

在这里插入图片描述

 二叉树性质5

二叉树的遍历

二叉树的遍历是指按一定的次序访问树中的所有结点,使每个结点恰好被访问一次。其中遍历次序保证了二叉树上每个结点均被访问一次且仅有一次。

二叉树常用的遍历有先序(根)遍历中序(根)遍历后序(根)遍历层次遍历

所谓先序、中序、后序,区别在于访问根结点的顺序。 1.先序遍历 若二叉树非空,则: ① 访问根结点; ② 先序遍历左子树; ③ 先序遍历右子树。 先序遍历序列的特点:其第一个元素值为二叉树中根结点值。

2.中序遍历 若二叉树非空,则: ① 中序遍历左子树; ② 访问根结点; ③ 中序遍历右子树。 中序遍历序列的特点:若已知二叉树的根结点值,以该值为界,将中序遍历序列分为两部分,前半部分为左子树的中序遍历序列,后半部分为右子树的中序遍历序列。

3.后序遍历 若二叉树非空,则: ① 后序遍历左子树; ② 后序遍历右子树; ③ 访问根结点。 后序遍历序列的特点:最后一个元素值为二叉树中根结点值。

4.层次遍历 层次遍历是从根结点出发,按照从上向下,同一层从左向右的次序访问所有的结点。采用层次遍历得到的访问结点序列称为层次遍历序列。 层次遍历序列的特点:其第一个元素值为二叉树中根结点值。

例:图1表示一个二叉树 img

前序遍历:ABCDEF 中序遍历:CBDAFE 后序遍历:CDBFEA 层次遍历:ABECDF

二叉树也可以采用两种存储方式:顺序存储结构和链式存储结构。

二叉树的顺序存储结构

顺序存储一棵二叉树时,就是用一组连续的存储单元存放二叉树中的结点。

由二叉树的性质4可知,对于完全二叉树(或满二叉树),树中结点层序编号可以唯一地反映出结点之间的逻辑关系,所以可以用一维数组按从上到下、从左到右的顺序存储树中所有结点值,通过数组元素的下标关系反映完全二叉树或满二叉树中结点之间的逻辑关系。

一棵完全二叉树的顺序存储结构:

 完全二叉树及其相应的顺序存储结构

一般的二叉树的顺序存储结构:

 一般二叉树及其相应的顺序存储结构

二叉树顺序存储结构的类型定义如下: typedef ElemType SqBinTree[MaxSize];

其中,ElemType为二叉树中结点的数据值类型,MaxSize为顺序表的最大长度。为了方便运算,通常将下标为0的位置空着,值为#的结点为空结点。

完全二叉树或满二叉树采用顺序存储结构比较合适,既能够最大可能地节省存储空间,又可以利用数组元素的下标确定结点在二叉树中的位置以及结点之间的关系。

对于一般二叉树,如果它接近于完全二叉树形态,需要增加的空结点个数不多,也可适合采用顺序存储结构。

如果需要增加很多空结点才能将一棵二叉树改造成为一棵完全二叉树,采用顺序存储结构会造成空间的大量浪费,这时不宜用顺序存储结构。例如:

 二叉树的顺序存储结构缺点

编程要求

根据提示,在右侧编辑器补充代码。具体要求如下:

  • InitBiTree(SqBiTree &T)//构造空二叉树T。
  • CreateBiTree(SqBiTree &T)//按层序次序输入二叉树中结点的值(字符型或整型), 构造顺序存储的二叉树T
  • BiTreeEmpty(SqBiTree T)//判断二叉树T是否为空二叉树,若是则返回TRUE,否则FALSE
  • BiTreeDepth(SqBiTree T)//返回二叉树T的深度
  • PreOrderTraverse(SqBiTree T,void(*Visit)(TElemType))//先序遍历二叉树T,对每个结点调用函数Visit一次且仅一次
  • InOrderTraverse(SqBiTree T,void(*Visit)(TElemType))//中序遍历二叉树T,对每个结点调用函数Visit一次且仅一次
  • PostOrderTraverse(SqBiTree T,void(*Visit)(TElemType))//后序遍历二叉树T,对每个结点调用函数Visit一次且仅一次
  • LevelOrderTraverse(SqBiTree T,void(*Visit)(TElemType)) // 层序遍历二叉树

测试说明

平台会对你编写的代码进行测试:

测试输入:ABCDEF###G##H

预期输出:

按先序遍历的结果为:ABDEGCFH

按中序遍历的结果为:DBGEAFHC

按后序遍历的结果为:DGEBHFCA

按层序遍历的遍历结果为:ABCDEFGH

该二叉树的高度为:4


开始你的任务吧,祝你成功!

实例

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

#define OK  1
#define ERROR 0

#define MAX_TREE_SIZE  100

typedef  char TElemType ;

typedef  TElemType  SqBiTree[MAX_TREE_SIZE];

TElemType Nil='#';

void input(TElemType &x)	 // 函数变量
{
	scanf("%c",&x);
}

void visit(TElemType x)	 // 函数变量
{
	printf("%c",x);
}

void InitBiTree(SqBiTree &T)
{ // 构造空二叉树T。因为T是数组名,故不需要&
	int i;
	for(i=0;i<MAX_TREE_SIZE;i++)
		T[i]=Nil; // 初值为空(Nil在主程中定义)
}


void CreateBiTree(SqBiTree &T)
{ // 按层序次序输入二叉树中结点的值(字符型或整型), 构造顺序存储的二叉树T
	/********** Begin **********/ 
	int i=1;
	scanf("%s",T+1);
	while(T[i] != '\0')
		i++;
	T[i]='#';
	/********** End **********/
}

int BiTreeEmpty(SqBiTree T)
{ // 初始条件:二叉树T存在。操作结果:若T为空二叉树,则返回TRUE,否则FALSE
	if(T[1]==Nil) // 根结点为空,则树空
		return 1;
	else
		return 0;
}

int BiTreeDepth(SqBiTree T)
{ // 初始条件:二叉树T存在。操作结果:返回T的深度
	/********** Begin **********/ 
	int i=MAX_TREE_SIZE-1,j;
	while(T[i]=='#')
		i--;
	j=i;
	int dep=0;
	do
    {
		dep++;
		j=j/2;
	}while(j>=1);
	return dep;
	
	/********** End **********/
}
void PreTraverse(SqBiTree T,int e)
{ // PreOrderTraverse()调用
	/********** Begin **********/ 
	if(T[e] != '#')
    {
		visit(T[e]);
		PreTraverse(T,2*e);
		PreTraverse(T,2*e+1);
	}
    
	/********** End **********/
}
void PreOrderTraverse(SqBiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树存在,Visit是对结点操作的应用函数
	// 操作结果:先序遍历T,对每个结点调用函数Visit一次且仅一次
	if(!BiTreeEmpty(T)) // 树不空
		PreTraverse(T,1);
	printf("\n");
}

void InTraverse(SqBiTree T,int e)
{ // InOrderTraverse()调用
	/********** Begin **********/ 
	if(T[e] != '#')
    {
		InTraverse(T,2*e);
		visit(T[e]);
		InTraverse(T,2*e+1);
	}   
    
	/********** End **********/
}

void InOrderTraverse(SqBiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树存在,Visit是对结点操作的应用函数
	// 操作结果:中序遍历T,对每个结点调用函数Visit一次且仅一次
	if(!BiTreeEmpty(T)) // 树不空
		InTraverse(T,1);
	printf("\n");
}

void PostTraverse(SqBiTree T,int e)
{ // PostOrderTraverse()调用
	/********** Begin **********/ 
	if(T[e] != '#')
    {
		PostTraverse(T,2*e);
		PostTraverse(T,2*e+1);
		visit(T[e]);
	}
	/********** End **********/
}

void PostOrderTraverse(SqBiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
	// 操作结果:后序遍历T,对每个结点调用函数Visit一次且仅一次
	if(!BiTreeEmpty(T)) // 树不空
		PostTraverse(T,1);
	printf("\n");
}

void LevelOrderTraverse(SqBiTree T,void(*Visit)(TElemType))
{ // 层序遍历二叉树
	/********** Begin **********/ 
	int dep=BiTreeDepth(T);
	int tree_max=pow(dep,2)-1;
	for(int i=1;i<tree_max;i++){
		if(T[i]=='#')
			continue;
		visit(T[i]);
	}
    printf("\n");
	/********** End **********/
}

int main()
{
	TElemType e;
	SqBiTree Bt,s;
	InitBiTree(Bt);
	CreateBiTree(Bt);    
	printf("按先序遍历的结果为:");
	PreOrderTraverse(Bt,visit);
	printf("按中序遍历的结果为:");
	InOrderTraverse(Bt,visit);
	printf("按后序遍历的结果为:");
	PostOrderTraverse(Bt,visit);
	printf("按层序遍历的遍历结果为:");
	LevelOrderTraverse(Bt,visit);  
	printf("该二叉树的高度为:%d\n",BiTreeDepth(Bt) );
	return 0;
}


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

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

相关文章

thinkphp6-配置设置与获取,Thinkphp6自定义配置文件以及调用(config文件夹下的配置)

环境变量 设置环境变量 /.env [DATABASE] USERNAME root PASSWORD 123456 获取环境变量 app/controller/Index.php <?php namespace app\controller;use app\BaseController; use think\facade\Env;class Index extends BaseController {public function index(){$usern…

IO模型的分类以及各个io模型之间的优劣势

本文主要讲解bio以及nio的一些问题和知识&#xff0c;会对aio进行简单讲解&#xff0c;但不会深入剖析 我们说熟知的io模型有哪些呢&#xff1f; 同步阻塞io同步非阻塞io同步多路复用异步非阻塞io java的io本身是不具有真正的io操作能力的&#xff0c;当调用io操作时&#x…

基于ArcGIS:GIS空间分析复习-理论概念+案例分析

目录 01 第一章 1.1 GIS空间分析的概念 1.2 GIS空间分析的研究对象、研究目标 1.3 研究目标是&#xff1a;认知、解释、预报、调控。 1.4 道路拓宽案例分析 1.5 GIS空间分析的核心问题 02 第二章 2.1 空间查询的概念、空间量算的概念 2.2 函数距离的概念 2.3 空间查询…

Android之 常用数据库框架整理

一 简介 1.1 上节说了关系型数据库有以下几种&#xff1a; Oracle、Microsoft SQL Server、Microsoft Access、MySQL、SQLite 1.2 各自的领域也不一样 java&#xff0c;C#&#xff0c;php等用Oracle&#xff0c;Microsoft SQL Server&#xff0c;MySQL比较多。 移动端Andr…

07 - 3系统容量规划

阿里系业务容量规划 Tair集群部署与水位调配 阿里系容量精调之单机压测场景 传统模拟请求 流量复制 流量转发 网关权重 线上测试注意点 阿里系混合部署技术 资源分时复用&#xff1a;提高资源利用率sigama框架做在线资源池调度&#xff0c;伏羲做离线资源池调度&#xff1b;…

基于fpga的图像处理之图像灰度化处理(Vivado+Modelsim+Matlab联合仿真验证)

** 基于fpga的图像处理之图像灰度化处理 ** 本文的思路框架&#xff1a; ①本文采用两种算法进行灰度处理&#xff0c;平均法和加权均值法&#xff1b;加权均值法采用了直接公式求解和查找表两种方式验证 ②FPGA设计中三个设计技巧&#xff0c;可用于工程项目借鉴&#xff…

Redis了解

Redis 源码大概做了哪些事情&#xff1f; 设置默认参数创建对象、持久化定时器回调加载文件参数 (使用配置文件替代部分默认参数)加载文件数据写入字典创建client connect事件handler&#xff08;accept后&#xff0c;写入读写事件select()&#xff0c;最新的版本用epoll&…

xlsx 导出 (简单使用)

下载数据为xlsx 安装 npm install xlsx 在src下创建文件utils文件夹&#xff0c;在utils文件夹下创建XLSX.js文件 // 下载excel功能 import * as XLSX from xlsx/*** param dataList 表格数据内容 array* param fileName 文件标题。必须以 .xlsx结尾*/ export const download…

Linux网络——Shell编程之快捷命令

Linux网络——Shell编程之快捷命令 一、快捷排序 — sort 命令二、快捷去重 — uniq 命令三、快捷替换 — tr 命令四、快速裁剪 — cut 命令五、文件拆分 — split 命令六、文件合并 —paste 命令七、变量扫描器 — eval 命令 一、快捷排序 — sort 命令 sort命令用于以行为单位…

五步看平台,选好安全的MT4交易外汇平台

在选择MT4外汇交易平台时&#xff0c;如何避免不正规的平台?以下是5招教你远离不正规MT4交易外汇平台。 1. 查看平台是否取得合法许可证 首要考虑的是该平台是否取得了合法的许可证。许可证是证明一个交易平台合法的最重要证据&#xff0c;因此务必在选择时核查该平台的许可证…

得物深入浅出解析JVM中的Safepoint

1.初识Safepoint-GC中的Safepoint 最早接触JVM中的安全点概念是在读《深入理解Java虚拟机》那本书垃圾回收器章节的内容时。相信大部分人也一样&#xff0c;都是通过这样的方式第一次对安全点有了初步认识。不妨&#xff0c;先复习一下《深入理解Java虚拟机》书中安全点那一章…

你真的了解Java类加载机制吗?

大家好&#xff0c;我是小米&#xff0c;一个喜欢分享技术的程序员。今天我来给大家简述一下Java类加载模型。 在Java中&#xff0c;类的加载过程是在程序运行时动态进行的。Java的类加载模型可以分为三个步骤&#xff1a;加载、连接和初始化。 类加载过程&#xff1a;加载 首…

Android面试指南:谈谈你对Flutter的理解

一、Flutter简介 Flutter是由Google开发的一种基于Dar编程语言的移动应用开发框架。可以帮助开发在构建高性能、美观、灵活的应用程序&#xff0c;从而实现跨平台开发&#xff0c;适用于与Android、ios、web、windows、macOS和linux等多个平台。 二、学习Flutter有什么优势 …

Java EE企业级应用开发(SSM)第11章

第11章SSM框架 一.预习笔记 1.准备jar包&#xff08;注意版本&#xff09; Spring一套包 Springmvc两个 Mybatis一个 Spring整合mybatis一个 Jstl一个用于jsp显示数据 Mysql一个用于访问数据库 Gson一个用于返回json数据 2.准备配置文件web.xml applicationContext.xml…

MySQL Client

MySQL客户端很多&#xff0c;自身携带的一些客户端工具也需要了解&#xff0c;方便快速测试。 MySQL Shell MySQL Shell Commands。 执行SQL语句时&#xff0c;必须切换到SQL模式。Shell指令较少&#xff0c;同时可以使用Python \py模式。 MySQL Shell所有的命令后面不需要加…

TCP通道和共享链路通道

推送SDK为了适应不同的场景和需求&#xff0c;对于一些对消息及时性、可靠性、自定义性要求高的应用&#xff0c;如即时通讯、社交、游戏等&#xff0c;可能更倾向于使用TCP通道&#xff0c;对于一些对消息节省流量、耗电量、兼容性要求高的应用&#xff0c;如新闻、天气、股票…

【软件工程】自动化测试保证卓越软件工程能力(3)

测试目标定义 对照目标系统&#xff0c;如下&#xff1a; 给出自动化测试平台目标如下&#xff1a; Case levelCase briefReport send toOVERALLUser 1 -> Process -> Customer 1BossLevel 1User 1 -> Process -> Customer 1 User 1 -> Process -> Custome…

AI自动写文章工具-ai文章智能生成器

随着人工智能技术的快速发展&#xff0c;越来越多的应用开始使用AI自动生成文章的功能&#xff0c;实现全自动、高质量和高效率的文章写作。本文将从全自动批量生成、没有错别字和标准语法、自动插入图片以及严格按照标准格式结构生成几个方面&#xff0c;展开对AI自动生成文章…

数据分析04——Pandas简介/Series对象/DataFrame对象

1、Pandas简介&#xff1a; Pandas是基于NumPy开发的数据分析三大剑客之一&#xff0c;Python数据分析的核心库提供快速、灵活、明确的数据结构Series对象&#xff1a;一维数组结构&#xff0c;由index和value构成DataFrame对象&#xff1a;二维数组结构&#xff0c;由index、…

MySQL基础(二十五)InnoDB数据存储结构

1 数据库的存储结构:页 索引结构给我们提供了高效的索引方式&#xff0c;不过索引信息以及数据记录都是保存在文件上的&#xff0c;确切说是存储在页结构中。另一方面&#xff0c;索引是在存储引擎中实现的&#xff0c;MySQL服务器上的存储引擎负责对表中数据的读取和写入工作…