数据结构:数据的逻辑结构,数据的存储结构,数据的基本操作
定义:由若干数据元素按照一定方式构成的复合数据以及作用于其上的函数或运算。
逻辑结构和存储结构 基本操作
数据的逻辑结构:元素及其间的数据约束关系的合称
数据的存储结构:建立由逻辑结构到存储结构的映射
一、基本数据结构
数据的逻辑结构:线性结构、非线性结构
线性结构:前驱结点和后继节点至多有一个。
数据的存储结构:顺序存储结构、链接存储结构、索引存储结构、散列存储结构
数据元素可为空的:
线性表(空表){堆栈(空栈)、队列(空队)、字符串(空串)}
二叉树
严格不为空:
树
一、线性结构
1.线性表
线性结构是一种逻辑结构,但是线性表逻辑结构为线性结构,并且有存储结构和基本操作;它们俩不是同一种东西。
线性表(位置上有序):由0个 或 多个具有 相同类型的 结点组成的 有序 集合。
n=0时 为空表,n>=1时存在表头和表尾。
表头(始结点)有一个后继节点,表尾(终结点)有一个前驱结点,中间结点有且且有一个前驱和后继。
逻辑结构为 线性结构
存储结构可以为 顺序存储 也可以为链接存储(链表)特殊的线性表: 堆栈、队列
堆栈:是一种操作受限的线性表,只允许在表的同一端进行插入和删除操作。后进先出。
栈顶:进行插入和删除的一端
栈底
空栈:没有元素时
顺序存储(数组)
链接存储(链表)
库函数 (#include<stack> 模板类)
队列:是一种操作受限的线性表,插入在队尾进行,删除在队头进行。先进先出
队头(front)
队尾(rear)
字符串:由0个 或 多个字符顺序排列组成的有序序列 简称为串。
子串在主串中的位置是指子串的首字符在主串中的序号。
一维数组
二、非线性结构
1.数组
数组:
一维数组是线性结构。
多维数组是非线性表,因为其前驱和后继可以抽象出多个,按列看和按行看就不一样了;在严格的定义下,二维数组不是线性表,但是在线性表的扩展下如:二维数组可以看作数据元素是线性表的线性表(neutral)。数组没有插入和删除操作,所以,不用预留空间,适合采用顺序存储。(可以用数组来存取线性表,但是数组这个数据结构本身是没有预留空间的,所以不存在插入删除操作)
矩阵:非线性表
可以用二维数组存取
2.树
树是结点的有限集合T,结点个数大于等于1。
①有一个根,root(T) (有根树)
②其余结点分成若干不相交的非空集合T1,T2····Tm (m>=0),都是树,称为root(T) 树T的根的子树。 (根的子树)
基本定义:
有序树:子树有相对次序 。 无序树:子树无相对次序
森林:0棵或多棵不相交 (非空)树的集合(通常是有序序列)
父亲:每个结点是它子树的父亲
儿子:每个结点是它父亲的儿子
兄弟:同一个父亲的儿子,它们的前驱为同一个数据元素
祖先:每个结点是它的子树的所有结点的祖先(包括父亲是儿子的祖先)
后裔:每个结点都是它祖先的后裔
结点的度(次数):该结点的 儿子 个数
树的度:树中 各结点度 的最大值
叶节点:没有儿子的结点,度为0的结点
分支节点:非叶节点,也就是有儿子的结点
结点的层数:根的层数为0,其余结点的层数为其父亲结点加1 (从第0层开始)
路径长度:从一个结点到另一个结点经过的边数(距离)
结点的深度:根到该结点的路径长度
结点的高度:叶节点高度为0,结点到叶节点的最长路径长度
树的深度:各叶节点深度 的 最大值。 最大层数。
树的高度:根的高度
结点的深度=结点的层数
树的深度=树的高度
深度、高度都与距离有关,深度与层数对应。
3.二叉树
定义:是结点的有限集合,它或者是空集,或者由一个根以及两棵不相交的子树 二叉树(可以为空)组成。(递归出口为子树为空集二叉树)
其中两个子树称为 左子树和 右子树,二叉树的子树必须是有序的,必须明确左子树和右子树,与树的定义不一样。
(二叉树不是树的特殊情况,有联系也有区别)
n个结点的树,一共有n-1条边,所以二叉树每个结点有两个指针共2*n个,其中的非空指针有n-1个(每一条边就是一个指针指向)