二元组可用图形表示:中间标有元素值的方框表示数据元素,称为借点。用有向线段从前件到后件。
基本概念 | 含义 |
---|---|
根节点 | 数据结构中,没有前件的节点 |
终端节点(叶子节点) | 数据结构中,没有后件的节点 |
内部节点 | 数据结构中,除了根节点和终端节点以外的节点 |
线性结构与非线性结构
线性表及其顺序存储结构
基本概念 | 含义 |
---|---|
线性结构 | 一个非空的数据结构如果满足以下两条件:1. 有且只有一个根节点 2. 每个节点最多有一个前件和最多一个后件 |
非线性结构 | 不满足以上两个条件的数据结构,主要是树形和网型结构 |
空数据结构:没有数据元素把只有一个数据元素的数据结构中的元素删除,就可以得到
线性表的基本概念
n个数据元素构成的有限序列
表中除第一个元素每个元素有且只有一个前件
除最后一个元素外每个元素有且只有一个后件
同一线性表中的数据元素必定具有相同的特性,即属同一数据对象。数组、矩阵、向量等都是线性表
非空线性表结构特征:
- 只有一个根节点,即节点a1,它无前件;
- 有且只有一个终端节点,即节点an,它无后件;
- 除根结点与终端节点外,其他所有节点有且只有一个前件,也有且只有一个后件。
节点个数n称为线性表长度,当n=0时,成为空表
线性表的顺序存储结构
基本特征:
- 线性表中所有元素所占存储空间是连续的;
- 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
线性表中各数据元素在存储空间中是紧邻的,且前件元素一定存储在后件元素前面。
栈和队列
栈及其基本运算
栈:一种特殊的线性表,它所有的插入和删除都限定在同一段进行,允许插入和删除的一端称为栈顶,不允许的另一端称为栈底。栈中没有元素称为空栈。
修改原则:后进先出或先进后出
指针top——栈顶;指针bottom——栈底 top反映栈的状态不断发生变化
基本运算:
- 入栈
- 退栈
- 读栈顶元素
通常采用顺序方式和链接方式实现栈
队列及其基本运算
(1). 队列定义
允许在一端进行插入,而在另一端进行删除的线性表
允许进行删除的一端称为对头(或排头)
允许进行插入的一端称为队尾
对列:Q=(q1,q2,…,qn)
q1为队头元素(排头元素)
qn为队尾元素
其退栈原则与栈相反:先进先出或先进后出
(2). 队列运算
队头指针——front; 队尾指针——rear 队头指针front总指向队头元素的前一位置,rear和front共同反映队列中元素动态变化情况
(3). 循环队列及其运算
将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。
增加标志s区分队空和队满:s=0为空;
s=1且front=rear为满
线性链表
线性链表的基本概念
(1). 线性链表
线性表的链式存储结构,简称链表。
每一个节点只有一个指针域,又称为单链表。
在线性链表中,第一个元素没有前件,指向链表中的第一个节点的指针称为头指针(HEAD),最后一个元素没有后件,最后一个节点的指针域为空,用NULL或0表示。
空表:HEAD = NULL 或 0
对线性链表中每个节点设置两个指针
左指针(Llink):一个指针域存放前件地址
右指针(Rlink):一个指针域存放后件地址
(2). 带链的栈
栈也可采用链式存储结构表示,把栈组织成一个单链表。
(3). 带链的队列
队列也可采用链式存储表示,队列中每个元素与栈中节点对应。
(4). 顺序表与链表的比较
类型 | 优点 | 缺点 |
---|---|---|
顺序表 | 1.可以随机存储表中的任意节点 2.无须为表示节点间的逻辑关系额外增加存储空间 | 1.顺序表的插入和删除运算效率很低 2.顺序表的存储空间不便于扩充 3.顺序表不便于对存储空间的动态分配 |
链表 | 1.在进行插入和删除时,只需要改变指针即可,不需要移动元素 2.存储空间易于扩充并且方便空间的动态分配 | 需要额外空间(指针域)来表示数据元素间的逻辑关系,存储密度比顺序表低 |
循环链表
在单链表第一个节点钱增加一个表头节点,队头节点指针指向表头结点,最后一个节点的指针域的值由NULL改为指向表头节点
循环链表中,所有节点的指针构成一个环状链
表头节点是循环表中固有的节点,表中没有数据元素的情况下,表中至少有一个节点存在,从而统一空表与非空表的运算
树与二叉树
树的基本概念
树是一种简单的非线性结构
基本概念 | 含义 |
---|---|
父节点 (根) | 在树结构中,每一个节点只有一个前件,称为该节点的父节点;没有前件的节点只有一个,称为树的根节点(根) |
节点和叶子节点 | 在树的结构中,每一个节点可以有多个后件,称为该节点的子节点。没有后件的节点称为叶子节点 |
度 | 在树的结构中,一个节点所拥有的后件个数称为该节点的度,树的度为所有节点中最大的 |
深度 | 定义一棵树的根节点所在层次为1,其他节点所在层次等于它的父节点所在层次加1。树的最大层次称为树的深度 |
子树 | 在树中,以某节点的一个子节点为根构成的树称为该节点的一棵子树 |
在树中,树中的节点数等于树中所有节点的度数之和加1
二叉树及其基本性质
(1). 二叉树定义
特点:
- 二叉树可以为空,空二叉树无节点,非空有且只有一个根节点;
- 每个节点最多有两棵子树,即二叉树不存在度大于2的节点;
- 二叉树的子树有左右之分,其次序不能任意颠倒。
(2). 二叉树性质
性质1:在二叉树第K层上,最多有2k-1(k>=1)个节点。
性质2:深度为m的二叉树中,最多有2m-1个节点。
性质3:对任何一棵二叉树,度为0的节点(即叶子节点)总是比度为2的节点多一个。
性质4:具有n个节点的二叉树,其深度至少为[log2n]+1,其中[log2n]表示其整数部分。
(3).满二叉树和完全二叉树
满二叉树:除最后一层外,每一层上所有节点都有两个子节点的二叉树
即满二叉树在其第k层上有2k-1个节点,且深度为m的满二叉树共有2m-1个节点
完全二叉树:除最后一层外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的若干节点的二叉树
有完全二叉树知,满二叉树一定是完全二叉树,完全二叉树一般不是满二叉树
完全二叉树特点:
- 叶子节点只可能在最后两层出现;
- 对任一节点,若其右子树的深度为m,则该结点左子树的深度为m或为m+1。
性质5:具有n个节点的完全二叉树的深度为[log2n]+1。
二叉树的存储结构
二叉树通常采用链式存储结构。存储节点由数据域和指针域构成。(二叉树表)
由于每个元素可有两个后件,所以存储结点的指针域有两个:一个用于指向该节点的左子节点,即左指针域;另一个用于指向该节点的右子节点,即右指针域。
对于满二叉树和完全二叉树可按层次进行顺序存储。
二叉树的遍历
不重复地访问二叉树中的所有节点
二叉树的遍历:
- 前序遍历(DLR)
- 中序遍历(LDR)
- 后序遍历(LRD)
(1). 前序遍历
首先访问根节点,然后遍历左子树,最后遍历右子树;并且在遍历左、右子树时,仍然先访问根节点,然后遍历左子树,最后遍历右子树
(2). 中序遍历
首先遍历左子树,然后访问根节点,最后遍历右子树;并且在遍历左、右子树时,仍然先遍历左子树,然后访问根节点,最后遍历右子树
(3). 后序遍历
首先遍历左子树,然后遍历右子树,最后访问根节点;并且在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根节点
若已知二叉树前、中 或中、后 可唯一确定二叉树,已知前、后不能唯一确定。
查找技术
顺序查找
逐个查找,若相等,查找成功;若扫描完,未找到相等元素,则查找失败。
- 最好情况,第一元素就是查找元素,则比较次数为1次。
- 最坏情况,最后一元素才是查找元素或没有查找元素,则比较次数为n次。
- 平均情况,大约需要比较n/2次。
顺序查找唯一选择的两种情况:
(1). 线性表为无序表(即表中的元素是无序的),则不管是顺序存储结构还是链式存储结构,都只能顺序查找。
(2). 即使线性表是有序的,如果采用链式存储结构,也只能顺序查找。
二分法查找
条件:
-
用顺序存储结构
-
线性表是有序表
对于一个长度为n的有序线性表,将中间值设为M,利用二分法查找元素X过程如下:
将X与M相比较:
(1).若X=M,则查找成功,结束查找;
(2).若X<M,则在线性表的前半部分以二分法继续查找;
(3).若X>M,则在线性表的后半部分以二分法继续查找。
顺序查找每一次比较,只将查找范围减1,
而二分法每一次比较,可将范围减少为原来的一半,效率大大提高。最坏情况,只需比较log2n次。
排序技术
交换类排序法
借助数据元素的“交换”来进行排序的一种方法
(1). 冒泡排序法
两两相邻数据元素之间比较和交换,不断消去***逆序***,直到所有数据元素有序为止
最坏情况,对于长度为n的线性表排序,需要比较次数为log2n次。
(2). 快速排序
待排序的n个元素中取一元素K(通常为第一个元素),以K为分割标准,把所有小于K的移至其前面,把所有大于K的移至其后面,这样,以K为分割线,分割为两个子表,称为一趟 排序。将两子表重复上述步骤,直至子表长度为1,此时,线性表已排好序了。
最坏情况,需进行n(n-1)/2次比较, 实际排序效率要比冒泡排序高得多
插入类排序法
每次将一待排元素,按其元素值大小插入到前面已排好序的子表中的适当位置,直至全部元素插入完成为止
(1). 简单插入元素
把n个待排序的元素看成是一个无序表和一个有序表,开始时,有序表只包含一个元素,而无序表包含另外n-1个元素,每次取无序表中的第一个元素插入到有序表中的正确位置,使其成为增加一个元素的新有序表。插入元素时,插入位置及其后的记录依次向后移动。最后有序表的长度为n,而无序表的长度为空,此时排序完成。
最坏情况,需要n(n-1)/2次比较
(2). 希尔排序
先取一整数(称为增量)d1<n,把全部数据元素分为d1组,所有距离为d1倍数的元素放在一组中,组成一个子序列,对每个子序列分别进行简单插入排序。然后取d2<d1重复上述分组和排序工作,直到di=1,即所有记录在一组中为止。
其排序效率与所选增量序列有关,最坏情况,需要比较nr(1<r<2)
选择类排序法
通过每一趟从待排序序列选出值最小元素,顺序放在已排好序的有序子表后面,直到全部序列满足排序要求为止
(1). 简单选择排序
先选出最小元素a,将a与第一个元素交换,在从剩下的n-1个元素中选出最小元素b与第二个元素交换·····重复直到所有元素有序为止
最坏情况,需要比较n(n-1)/2次
(2). 堆排序法
若有n个元素的序列(h1,h2,···,hn),将元素按顺序组成一棵完全二叉树,当且仅当满足下列条件时称为堆。
hi>=h2i and hi>=h2i+1
或者
hi<=h2i and hi<=h2i+1
其中,i=1,2,3···,n-2。
第一种情况称为大根堆,所有结点的值大于或等于左右子节点的值。
第二种情况称为小根堆,所有节点的值小于或等于左右子节点的值。
最坏情况,需要nlog2n此比较
二元组可用图形表示:中间标有元素值的方框表示数据元素,称为借点。用有向线段从前件到后件。
基本概念 | 含义 |
---|---|
根节点 | 数据结构中,没有前件的节点 |
终端节点(叶子节点) | 数据结构中,没有后件的节点 |
内部节点 | 数据结构中,除了根节点和终端节点以外的节点 |
线性结构与非线性结构
线性表及其顺序存储结构
基本概念 | 含义 |
---|---|
线性结构 | 一个非空的数据结构如果满足以下两条件:1. 有且只有一个根节点 2. 每个节点最多有一个前件和最多一个后件 |
非线性结构 | 不满足以上两个条件的数据结构,主要是树形和网型结构 |
空数据结构:没有数据元素把只有一个数据元素的数据结构中的元素删除,就可以得到
线性表的基本概念
n个数据元素构成的有限序列
表中除第一个元素每个元素有且只有一个前件
除最后一个元素外每个元素有且只有一个后件
同一线性表中的数据元素必定具有相同的特性,即属同一数据对象。数组、矩阵、向量等都是线性表
非空线性表结构特征:
- 只有一个根节点,即节点a1,它无前件;
- 有且只有一个终端节点,即节点an,它无后件;
- 除根结点与终端节点外,其他所有节点有且只有一个前件,也有且只有一个后件。
节点个数n称为线性表长度,当n=0时,成为空表
线性表的顺序存储结构
基本特征:
- 线性表中所有元素所占存储空间是连续的;
- 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
线性表中各数据元素在存储空间中是紧邻的,且前件元素一定存储在后件元素前面。
栈和队列
栈及其基本运算
栈:一种特殊的线性表,它所有的插入和删除都限定在同一段进行,允许插入和删除的一端称为栈顶,不允许的另一端称为栈底。栈中没有元素称为空栈。
修改原则:后进先出或先进后出
指针top——栈顶;指针bottom——栈底 top反映栈的状态不断发生变化
基本运算:
- 入栈
- 退栈
- 读栈顶元素
通常采用顺序方式和链接方式实现栈
队列及其基本运算
(1). 队列定义
允许在一端进行插入,而在另一端进行删除的线性表
允许进行删除的一端称为对头(或排头)
允许进行插入的一端称为队尾
对列:Q=(q1,q2,…,qn)
q1为队头元素(排头元素)
qn为队尾元素
其退栈原则与栈相反:先进先出或先进后出
(2). 队列运算
队头指针——front; 队尾指针——rear 队头指针front总指向队头元素的前一位置,rear和front共同反映队列中元素动态变化情况
(3). 循环队列及其运算
将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。
增加标志s区分队空和队满:s=0为空;
s=1且front=rear为满
线性链表
线性链表的基本概念
(1). 线性链表
线性表的链式存储结构,简称链表。
每一个节点只有一个指针域,又称为单链表。
在线性链表中,第一个元素没有前件,指向链表中的第一个节点的指针称为头指针(HEAD),最后一个元素没有后件,最后一个节点的指针域为空,用NULL或0表示。
空表:HEAD = NULL 或 0
对线性链表中每个节点设置两个指针
左指针(Llink):一个指针域存放前件地址
右指针(Rlink):一个指针域存放后件地址
(2). 带链的栈
栈也可采用链式存储结构表示,把栈组织成一个单链表。
(3). 带链的队列
队列也可采用链式存储表示,队列中每个元素与栈中节点对应。
(4). 顺序表与链表的比较
类型 | 优点 | 缺点 |
---|---|---|
顺序表 | 1.可以随机存储表中的任意节点 2.无须为表示节点间的逻辑关系额外增加存储空间 | 1.顺序表的插入和删除运算效率很低 2.顺序表的存储空间不便于扩充 3.顺序表不便于对存储空间的动态分配 |
链表 | 1.在进行插入和删除时,只需要改变指针即可,不需要移动元素 2.存储空间易于扩充并且方便空间的动态分配 | 需要额外空间(指针域)来表示数据元素间的逻辑关系,存储密度比顺序表低 |
循环链表
在单链表第一个节点钱增加一个表头节点,队头节点指针指向表头结点,最后一个节点的指针域的值由NULL改为指向表头节点
循环链表中,所有节点的指针构成一个环状链
表头节点是循环表中固有的节点,表中没有数据元素的情况下,表中至少有一个节点存在,从而统一空表与非空表的运算
树与二叉树
树的基本概念
树是一种简单的非线性结构
基本概念 | 含义 |
---|---|
父节点 (根) | 在树结构中,每一个节点只有一个前件,称为该节点的父节点;没有前件的节点只有一个,称为树的根节点(根) |
节点和叶子节点 | 在树的结构中,每一个节点可以有多个后件,称为该节点的子节点。没有后件的节点称为叶子节点 |
度 | 在树的结构中,一个节点所拥有的后件个数称为该节点的度,树的度为所有节点中最大的 |
深度 | 定义一棵树的根节点所在层次为1,其他节点所在层次等于它的父节点所在层次加1。树的最大层次称为树的深度 |
子树 | 在树中,以某节点的一个子节点为根构成的树称为该节点的一棵子树 |
在树中,树中的节点数等于树中所有节点的度数之和加1
二叉树及其基本性质
(1). 二叉树定义
特点:
- 二叉树可以为空,空二叉树无节点,非空有且只有一个根节点;
- 每个节点最多有两棵子树,即二叉树不存在度大于2的节点;
- 二叉树的子树有左右之分,其次序不能任意颠倒。
(2). 二叉树性质
性质1:在二叉树第K层上,最多有2k-1(k>=1)个节点。
性质2:深度为m的二叉树中,最多有2m-1个节点。
性质3:对任何一棵二叉树,度为0的节点(即叶子节点)总是比度为2的节点多一个。
性质4:具有n个节点的二叉树,其深度至少为[log2n]+1,其中[log2n]表示其整数部分。
(3).满二叉树和完全二叉树
满二叉树:除最后一层外,每一层上所有节点都有两个子节点的二叉树
即满二叉树在其第k层上有2k-1个节点,且深度为m的满二叉树共有2m-1个节点
完全二叉树:除最后一层外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的若干节点的二叉树
有完全二叉树知,满二叉树一定是完全二叉树,完全二叉树一般不是满二叉树
完全二叉树特点:
- 叶子节点只可能在最后两层出现;
- 对任一节点,若其右子树的深度为m,则该结点左子树的深度为m或为m+1。
性质5:具有n个节点的完全二叉树的深度为[log2n]+1。
二叉树的存储结构
二叉树通常采用链式存储结构。存储节点由数据域和指针域构成。(二叉树表)
由于每个元素可有两个后件,所以存储结点的指针域有两个:一个用于指向该节点的左子节点,即左指针域;另一个用于指向该节点的右子节点,即右指针域。
对于满二叉树和完全二叉树可按层次进行顺序存储。
二叉树的遍历
不重复地访问二叉树中的所有节点
二叉树的遍历:
- 前序遍历(DLR)
- 中序遍历(LDR)
- 后序遍历(LRD)
(1). 前序遍历
首先访问根节点,然后遍历左子树,最后遍历右子树;并且在遍历左、右子树时,仍然先访问根节点,然后遍历左子树,最后遍历右子树
(2). 中序遍历
首先遍历左子树,然后访问根节点,最后遍历右子树;并且在遍历左、右子树时,仍然先遍历左子树,然后访问根节点,最后遍历右子树
(3). 后序遍历
首先遍历左子树,然后遍历右子树,最后访问根节点;并且在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根节点
若已知二叉树前、中 或中、后 可唯一确定二叉树,已知前、后不能唯一确定。
查找技术
顺序查找
逐个查找,若相等,查找成功;若扫描完,未找到相等元素,则查找失败。
- 最好情况,第一元素就是查找元素,则比较次数为1次。
- 最坏情况,最后一元素才是查找元素或没有查找元素,则比较次数为n次。
- 平均情况,大约需要比较n/2次。
顺序查找唯一选择的两种情况:
(1). 线性表为无序表(即表中的元素是无序的),则不管是顺序存储结构还是链式存储结构,都只能顺序查找。
(2). 即使线性表是有序的,如果采用链式存储结构,也只能顺序查找。
二分法查找
条件:
-
用顺序存储结构
-
线性表是有序表
对于一个长度为n的有序线性表,将中间值设为M,利用二分法查找元素X过程如下:
将X与M相比较:
(1).若X=M,则查找成功,结束查找;
(2).若X<M,则在线性表的前半部分以二分法继续查找;
(3).若X>M,则在线性表的后半部分以二分法继续查找。
顺序查找每一次比较,只将查找范围减1,
而二分法每一次比较,可将范围减少为原来的一半,效率大大提高。最坏情况,只需比较log2n次。
排序技术
交换类排序法
借助数据元素的“交换”来进行排序的一种方法
(1). 冒泡排序法
两两相邻数据元素之间比较和交换,不断消去***逆序***,直到所有数据元素有序为止
最坏情况,对于长度为n的线性表排序,需要比较次数为log2n次。
(2). 快速排序
待排序的n个元素中取一元素K(通常为第一个元素),以K为分割标准,把所有小于K的移至其前面,把所有大于K的移至其后面,这样,以K为分割线,分割为两个子表,称为一趟 排序。将两子表重复上述步骤,直至子表长度为1,此时,线性表已排好序了。
最坏情况,需进行n(n-1)/2次比较, 实际排序效率要比冒泡排序高得多
插入类排序法
每次将一待排元素,按其元素值大小插入到前面已排好序的子表中的适当位置,直至全部元素插入完成为止
(1). 简单插入元素
把n个待排序的元素看成是一个无序表和一个有序表,开始时,有序表只包含一个元素,而无序表包含另外n-1个元素,每次取无序表中的第一个元素插入到有序表中的正确位置,使其成为增加一个元素的新有序表。插入元素时,插入位置及其后的记录依次向后移动。最后有序表的长度为n,而无序表的长度为空,此时排序完成。
最坏情况,需要n(n-1)/2次比较
(2). 希尔排序
先取一整数(称为增量)d1<n,把全部数据元素分为d1组,所有距离为d1倍数的元素放在一组中,组成一个子序列,对每个子序列分别进行简单插入排序。然后取d2<d1重复上述分组和排序工作,直到di=1,即所有记录在一组中为止。
其排序效率与所选增量序列有关,最坏情况,需要比较nr(1<r<2)
选择类排序法
通过每一趟从待排序序列选出值最小元素,顺序放在已排好序的有序子表后面,直到全部序列满足排序要求为止
(1). 简单选择排序
先选出最小元素a,将a与第一个元素交换,在从剩下的n-1个元素中选出最小元素b与第二个元素交换·····重复直到所有元素有序为止
最坏情况,需要比较n(n-1)/2次
(2). 堆排序法
若有n个元素的序列(h1,h2,···,hn),将元素按顺序组成一棵完全二叉树,当且仅当满足下列条件时称为堆。
hi>=h2i and hi>=h2i+1
或者
hi<=h2i and hi<=h2i+1
其中,i=1,2,3···,n-2。
第一种情况称为大根堆,所有结点的值大于或等于左右子节点的值。
第二种情况称为小根堆,所有节点的值小于或等于左右子节点的值。
最坏情况,需要nlog2n此比较