文章目录
- 数据结构绪论:
- 线性表
- 顺序表(随即存取结构)
- 链表(顺序存取结构)
- 栈和队列
- 树和二叉树
- 树的遍历
- 二叉树
- 哈夫曼树
- 图
- 图的遍历
- 最小生成树
- 拓扑排序
数据结构绪论:
- 数据项:数据的最小单位
- 数据元素:数据的基本单位
- 数据结构是带有结构的各数据元素的集合
- 一些表面上很不相同的数据可以有相同的逻辑结构
线性表
- 将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是n(当第一个有序表所有的元素都小于或大于第二个表中的元素)
- 除第一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继
顺序表(随即存取结构)
- 顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是108(注意:不是110)
- 在一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为63.5(平均要移动的个数:n/2;)
补充1:n个元素的顺序表中,查找:平均移动的元素个数为(n+1)/2
补充2:n个元素的顺序表中,插入:平均移动的元素个数为n/2
补充3:n个元素的顺序表中,删除:平均移动的元素个数为(n-1)/2
链表(顺序存取结构)
- 线性表若采用链式存储结构,要求内存中可用存储单元的地址连续或不连续都可以
- 单链表的存储密度**<1**(顺序表的=1)
- 链表适用于需不断对表进行插入,删除
- 创建一个包括n个结点的有序单链表的时间复杂度是O(n的平方) (创建表O(n),排序也是如此)
栈和队列
栈:先进后出
队列:先进先出
- 栈在递归调用,函数调用,表达式求值都有所应用
- 解决缓冲区问题,用到队列(先进先出的线性表)
- 若一个栈以向量V[1…n]存储,初始栈顶指针top设置为n+1,则元素x进栈的正确操作是
top--;V[top] = x;
(V[1…n]存储和top设置为n+1,可以看出:元素从数组向量的高端地址进栈) - 判断表达式中括号配对用到栈
- 用链接方式存储的队列,在进行删除运算时头,尾指针可能都要修改(一般情况下只修改头指针,但是,当删除的是队列中的最后一个元素时,队尾指针也丢失了,因此需要对队尾指针重新赋值)
- 最大容量为n的循环队列,队满
(rear+1)%n == front;
;队空rear == front;
- 一个递归算法必须包括终止条件和递归部分
树和二叉树
- 树的度: 树内各结点度的最大值
- 树的深度: 树中结点的最大层次
- 二叉树是有序树
- 二叉树有5种基本形态(空二叉树,仅有根结点的二叉树,右子树为空的二叉树,左子树为空的二叉树,左右结点均非空的二叉树)
- 在二叉树的第i层上至多有2的(i-1)次方个结点
- 深度为k的二叉树至多有2的k次方-1个结点
- 叶子数 = 度为2的结点数 + 1
- 满二叉树(深度为k且含有(2的k次方-1)个结点),注意与完全二叉树的区分,别记混
- 完全二叉树,度为1的结点个数为0或1个
树的遍历
先序遍历
- 根结点
- 先序遍历左子树
- 先序遍历右子树
中序遍历
- 中序遍历左子树
- 根结点
- 中序遍历右子树
后序遍历
- 后序遍历左子树
- 后序遍历右子树
- 根结点
二叉树
- 把一棵树转换为二叉树后,这颗二叉树的形态是唯一的(因为二叉树是有序的)
- 一颗完全二叉树上有1001个结点,其中叶子结点的个数501
n0 = n2 + 1
n0+n1+n2 = 1001
在完全二叉树中,n1 = 0或1 - 利用二叉链表存储树,则根结点的右指针为空(左孩子右兄弟,注意:问的是根结点)
- 在一棵度为4的数T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶结点个数是82
n0+n1+n2+n3+n4-1 = n1+2乘以n2+3乘以n3+4*n4 - 一颗非空的二叉树的先序遍历序列和后序遍历序列正好相反,则二叉树
一定满足:只有一个叶子结点
或一定满足:所有的结点均无左孩子或所有的结点均无右孩子
哈夫曼树
- 哈夫曼树中没有度为1的结点
- 哈夫曼树中两个权值最小的结点一定是兄弟结点
- 哈夫曼树中任一非叶结点的权值一定不小于下一层任一结点的权值
图
- 对于无向图,具有 n(n-1)/2 条边,则称为无向完全图
- 对于有向图,具有 n(n-1) 条弧,则称为有向完全图
- 带权的图通常称为网
- 在一个无向图中,所有顶点的度数之和等于图的边数的2倍
- n个顶点的连通图用邻接矩阵表示时,该矩阵至少有**2(n-1)**个非零元素
- G是一个非连通无向图,共有28条边,则该图至少有9个顶点(若是连通图刚好8个顶点,但是,这是非连通图,要更大一些)
- 拓扑排序可以判断一个有向图是否有环
- 无向图的邻接矩阵是对称的
图的遍历
- 深度优先搜索(通常借助栈来实现算法)
- 广度优先搜索(通常借助队列来实现算法)
最小生成树
- 在一个连通网的所有生成树中,各边的代价之和最小的那颗生成树(最小生成树)
- 普里姆算法(加点法),适用于稠密图
- 克鲁斯卡尔算法(加边法),适用于稀疏图
拓扑排序
参考资料:
《数据结构 C语言版 第2版》严蔚敏 李冬梅 吴伟民