基础类型
线性表
类型定义
- 一个线性表是n个数据元素的有限序列
- 线性表的长度可根据需要增长或缩短,即对线性表的数据元素可以查询,还可以进行插入和删除操作。
线性表的顺序表示
- 用一组地址连续的存储单元一次存储线性表的数据元素
- 表中相邻的元素ai和ai+1赋以相邻的存储位置LOC(ai)和LOC(ai+1),以元素在计算机内“物理位置相邻”表示线性表中数据元素之间的逻辑关系。
线性表的链式表示
- 线性链表
- 用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。
- 存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。
- 指针域中存储的信息称做指针或链。
- 循环链表
- 表中最后一个结点的指针域指向头结点,整个链表形成一个环。
- 双向链表
- 双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前趋。
栈
定义
限定仅在表尾进行插入或删除操作的线性表
。- 对栈来说,表尾端称为栈顶,表头端称为栈底。
- 栈的修改是按后进先出原则。
顺序栈
- 利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
栈的应用举例
- 数制转换
- 括号匹配检验
- 行编辑程序
- 算法
- 迷宫求解
- 表达式求值
栈与递归的实现
- 一个通过调用自己或通过一系列的调用语句间接调用自己的函数,称为递归函数
- 递归求解。
- 八皇后问题
- Hanoi问题
队列
定义
- 队列是一种
先进先出(FIFO)的线性表
。 - 队列只允许在表的一端插入(队尾),另一端删除元素(队头)。
双端队列
- 限定插入和删除操作在表的两端进行的线性表
队列的链式表示
- 用链表表示的队列称为链队列。
- 一个链队列需要两个分别指示队头和队尾的指针才能唯一确定。
- 删除队列头元素算法时,需要修改头结点中的指针,但当队列中最后一个元素被删后,队列尾指针也丢失了,需要对队尾指针重新赋值(指向头结点)。
队列的顺序表示
- 用一组地址连续的存储单元依次存放从队列头到队列尾的元素外,还需添加两个指针front和rear分别指示队列头元素及队列尾元素的位置。
数组
数组的顺序表示
- 数组一般不作插入或删除操作,一旦建立了数组,结构中的数据元素个数和元素间的关系就不再发生变动。
树和二叉树
树
- 树是n个结点的有限集。
- 树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树称为结点的度。
- 森林是m(m>=0)颗互不相交的树的集合。
二叉树
- 二叉树每个结点至多只有两颗子树,并且二叉树的子树有左右之分。
- 二叉树的性质
在二叉树的第i层上最多有2^i-1^个结点
深度为k的二叉树至多有2^k^-1个结点
- 任何一颗二叉树T,
如果其终端结点数为n~0~,度为2的结点数为n~2~,则n~0~ = n~2~ + 1
- 具有n个结点的完全二叉树的深度为[log2n] + 1 <向下取整>
- 满二叉树:一颗深度为K且有2k-1个结点的二叉树
- 完全二叉树:深度为k,有n个结点的二叉树,当且仅当其每个及诶单都与深度k的满二叉树中编号从1至n的结点一一对应。
- 二叉树的顺序存储
- 二叉树的链式存储
遍历二叉树和线索二叉树
- 遍历二叉树
- 遍历二叉树是以一定的规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序序列或中序序列或后序序列。
先序遍历
:若二叉树为空,则空操作;否则访问根节点;先序遍历左子树;先序遍历右子树。
*中序遍历
:若二叉树为空,则空操作;否则中序遍历左子树;访问根节点;中序遍历右子树。后序遍历
:若二叉树为空,则空操作;否则后序遍历左子树;后序遍历右子树;访问根节点。
- 搜索二叉树
- 若结点有左子树,则其lchild域指示其左孩子,否则令lchild域指示其前驱;若结点有右子树,则rchild域指示其右孩子,否则令rchild域指示其后继,以这种结点结构构成的二叉链表作为二叉树的存储结构,叫线索链表。其中指向结点前驱和后继的指针叫做线索。加上线索的二叉树称为线索二叉树。
树和森林
- 树的存储结构
- 双亲表示法
- 孩子表示法
- 孩子兄弟表示法
- 森林与二叉树的转换
赫夫曼树(Huffman,最优二叉树)
- 假设有n个权值,一颗有n个叶子结点的二叉树,每个叶子结点带权wi,则其中带权路径长度WPL最小的二叉树称为最优二叉树或赫夫曼树。
图
图的定义
- 图的数据元素通常称为顶点,V是顶点的有穷非空集合;VR是两个顶点之间的关系的集合。
- 有向图
- 无向图
- 完全图
- 稀疏图
- 稠密图
- 连通图、连通分量
图的存储结构
- 数组表示法
- 邻接表
- 十字链表
- 邻接多重表
图的遍历
- 深度优先遍历(DFS)
- 广度优先遍历(BFS)