线性表
线性表
线性表的定义
线性表是一种由零个或多个数据元素组成的有限序列的数据结构
线性表的类型
顺序线性表
链式线性表
顺序线性表
数组的定义
数组是一种存储单元上连续的线性表,数据元素通过下标访问
数组的优点
数据元素通过下标访问,无需存储数据元素的逻辑关系,访问效率高
数组的缺点
数组长度固定,不支持动态分配,插入和删除操作需要移动其他数据元素,空间利用率低
找出数组中重复的数据
数组A初始输入数据,数组B初始没有数据,数组C初始没有数据,遍历数组A,如果数组A中的的数据不被数组B包含,那么就把这个数据添加到数组B中以后继续遍历数组A,如果被数组B包含,则添加到数组C中以后继续遍历数组A,数组C即为重复的数据
找出数组中没有重复的数据
数组A初始输入数据,数组B初始没有数据,数组C初始没有数据,遍历数组A,如果数组A中的的数据不被数组B包含,那么就把这个数据添加到数组B和数组C中以后继续遍历数组A,如果被数组B包含,则从数组C中移除以后继续遍历数组A,数组C即为没有重复的数据
链式线性表
链表的定义
链表是一种存储单元上非连续的线性表,数据元素通过指针访问
链表的优点
链表长度不固定,支持动态分配,插入和删除操作不需要移动其他数据元素,空间利用率高
链表的缺点
数据元素通过指针访问,需要存储数据元素的逻辑关系,访问效率低
单链表的定义
单链表是一种由结点组成的链表,结点包含数据元素和指针元素,指针元素指向下一个结点,最后一个结点的指针元素指向空
循环链表的定义
循环链表是一种由结点组成的链表,结点包含数据元素和指针元素,指针元素指向下一个结点,最后一个结点的指针元素指向第一个结点
双向链表的定义
双向链表是一种由结点组成的链表,结点包含数据元素和前指针元素和后指针元素,前指针元素指向上一个结点,后指针元素指向下一个结点,第一个结点的前指针元素指向空,最后一个结点的后指针元素指向空
双向循环链表的定义
双向循环链表是一种由结点组成的链表,结点包含数据元素和前指针元素和后指针元素,前指针元素指向上一个结点,后指针元素指向下一个结点,第一个结点的前指针元素指向最后一个结点,最后一个结点的后指针元素指向第一个结点
栈
栈
栈的定义
栈是一种在尾部进行插入和删除操作的线性表,特点是先进后出
栈的类型
顺序栈
链式栈
递归函数
递归函数是一种直接或者间接调用自身的函数,在进入递归时,函数的局部变量和参数值以及返回地址都会入栈,在退出递归时,函数的局部变量和参数值以及返回地址都会出栈,用于当前递归深度下其余代码的执行
后缀表达式求值
从左到右遍历后缀表达式,遇到数字就进栈,遇到符号就将位于栈顶的两个数字出栈,数字和符号运算后的结果再进栈,直到获得最终结果
中缀表达式转后缀表达式
从左到右遍历中缀表达式,遇到数字就输出,遇到符号需要判断其与栈顶符号的优先级,是右括号或者优先级不高于栈顶符号则栈顶元素一次出栈并输出,并将当前符号进栈,直到获得最终输出
栈实现队列
栈A初始输入数据,栈B初始没有数据,数据入栈时正常进入栈A,数据出栈时把栈A的数据依次出栈后再依次进入栈B,栈A的最后一个数据直接出栈不进入栈B,栈B的数据依次出栈后再依次进入栈A,这样进栈和出栈的数据就实现了队列先进先出的特点
队列
队列
队列的定义
队列是一种在尾部进行插入操作和在头部进行删除操作的线性表,特点是先进先出
队列的类型
顺序队列
链式队列
循环队列的定义
循环队列是一种头部和尾部相连的队列
队列实现栈
队列A初始输入数据,队列B初始没有数据,数据入队列时正常进入队列A,数据出队列时把队列A的数据依次出队列后再依次进入队列B,队列A的最后一个数据直接出队列不进入队列B,队列B的数据依次出队列后再依次进入队列A,这样进队列和出队列的数据就实现了栈先进后出的特点
串
串
串的定义
串是一种由零个或多个字符组成的有限序列的数据结构,也称为字符串
模式匹配
模式匹配
模式匹配是指在主串中定位子串位置的操作
朴素模式匹配
遍历主串的每一个字符,以字符作为子串的开头与子串进行匹配,每个字符做子串长度的循环继续进行匹配,直到匹配成功或遍历完成
KMP模式匹配
KMP模式匹配是在朴素模式匹配的基础上进行了改进,改进的关键点在于通过对子串前后对称重复度的检测,省略了主串遍历中和子串循环中的多余匹配,从而大大提高了模式匹配的效率
KMP改进模式匹配
KMP改进模式匹配是在KMP模式匹配的基础上进行了改进,改进的关键点在于除了通过对子串前后对称重复度的检测,还通过对子串前前重复度的检测,省略了主串遍历中和子串循环中的多余匹配,进一步提高了模式匹配的效率
树
树
树的定义
树是一种由零个或多个结点组成的有限集的数据结构,有且仅有一个结点称为根结点,其余结点可分为多个互不相交的有限集,也称为子树
森林的定义
森林是一种由零个或多个树组成的互不相交的有限集
结点的类型
非终端结点,也称为分支结点
终端结点,也称为叶结点
结点的关系
结点的子结点称为该结点的孩子结点,该结点称为子结点的父母结点
树的表示法
双亲表示法
孩子表示法
孩子兄弟表示法
二叉树
二叉树的定义
二叉树是一种由一个根结点和两棵互不相交分别称为根结点的左子树和右子树的二叉树组成的树
二叉树的特点
每个结点最多有两颗子树
左子树和右子树有固定顺序
只有一颗子树的结点需要区分是左子树还是右子树
斜树的定义
斜树是一种所有结点都只有左子树或右子树的二叉树
满二叉树的定义
满二叉树是一种所有结点都存在左子树和右子树并且所有叶结点都在同一层上的二叉树
完全二叉树的定义
完全二叉树是一种如果从上到下从左到右依次对结点进行编号后位置和相同深度的满二叉树完全相同的二叉树
二叉树的性质
二叉树的第 N 层上至多有 2 ^ ( N - 1 ) 个结点
深度为 N 的二叉树至多有 2 ^ N - 1 个结点
如果度为0的结点数为 X ,度为2的结点数为 Y ,那么 X = Y + 1
具有 N 个结点的完全二叉树的深度为 [ log2 N ] + 1( [ X ]表示不大于X的最大整数 )
具有 N 个结点( 任一结点编号为 X )的完全二叉树,如果 X = 1,则结点 X 无父母结点,即为根结点,如果 X > 1,则父母结点是结点 [ X / 2 ]( [ X ]表示不大于X的最大整数 )
具有 N 个结点( 任一结点编号为 X )的完全二叉树,如果 2X > N,则结点 X 无左孩子结点,即为叶结点,否则其左孩子结点是结点 2X
具有 N 个结点( 任一结点编号为 X )的完全二叉树,如果 2X + 1 > N,则结点 X 无右孩子结点,否则其右孩子结点是结点 2X + 1
二叉树的存储结构
二叉数组
二叉链表
线索链表
二叉树的遍历
前序遍历
中序遍历
后序遍历
层序遍历
树转二叉树
在所有兄弟结点之间加一条连线,每个结点只保留与第一个孩子结点的连线,去掉其他孩子结点的连线,调整层次结构后则转为二叉树
二叉树转树
如果结点有左孩子结点,那么该结点的左孩子结点以及其右孩子结点和右孙子结点(一直到右结点没有为止)与该结点之间加一条连线,去掉原二叉树中所有结点与右孩子结点的连线,调整层次结构后则转为树
哈夫曼树的定义
哈夫曼树是一种带权路径长度最小的二叉树
哈夫曼树的构造
第一步,根据给定的 N 个权值构成的 N 棵二叉树的森林,其中每棵二叉树都只有一个带权的根结点,左右子树均为空
第二步,在森林中选取两棵根结点的权值最小的树作为左右子树构造一颗新的二叉树,并且将新的二叉树的根结点的权值为其左右子树上根结点的权值之和
第三步,在森林中删除这两棵树,同时加入新得到的树
第四步,重复第二步和第三步,直到森林只剩一棵树为止,这棵树便是哈夫曼树
哈夫曼编码
以编码的字符作为叶结点并且以字符的频率作为叶结点的权值构造一棵哈夫曼树,规定哈夫曼树的左分支为0,右分支为1,则根结点到叶结点经过的路径组成的01序列便为该叶结点对应字符的编码,这就是哈夫曼编码
图
图
图的定义
图是一种由顶点的有穷非空集合和顶点之间边的集合组成的数据结构