数据结构(期末复习)
期末了!!!
顺序随机的
一、树
- 对完全二叉树、满二叉树的结构(编号)有一个好的认识
- 二叉树的存储结构:孩子兄弟链表法、双亲表示法、孩子链表存储结构
- 二叉树的先序遍历和后序遍历序列正好相反,则二叉树一定满足的条件:高度等于其结点数
- 如果m是n的祖先,使用后序遍历的非递归过程更方便找到从m到n的路径
- 不用栈实现后序遍历的非递归:最佳方案,采用三叉链表表示
- 二叉树采用二叉链表存储结构,要交换所有分支结点的左右子树的位置,利用基于后序遍历的递归算法最合适。
- 二叉树线索化时,空的左指针指向前驱结点,空的右指针指向后继结点
- 哈夫曼树不一定是完全二叉树
- 一棵树的先根遍历和后根遍历,其中叶子结点出现的相对次序是相同的。
- 树的孩子兄弟表示法是一种二叉链表表示法。
- 可以不用栈实现基于中序线索二叉链表对二叉树进行中序遍历。(迭代实现)
二、图
- 无向图( ) 有向图<>
-
有向图:强连通分量,强连通图; 无向图:连通分量,连通图
-
深度优先搜索:借助 栈 ; 广度优先搜索:借助队列
-
可以借助拓扑排序判断有向图中是否存在回路(拓扑排序不能给 有向环状的结构排序)
-
AOE网:任何一个关键活动的提前完成,整个工程的完成时间都会提前(❌)
-
使用有向图的十字链表,能非常方便地计算出任意一个顶点的出度和入度
-
十字链表:将逆邻接表中的边的信息存在邻接表中
-
邻接多重表:图的一个顶点用一个头结点表示(data , firstedge)
图的一个边用一个“结点”表示(mark,vi,vj,vilink,vjlink)
-
对于一个无向图,进行一次广度优先搜索,能访问到图的所有顶点。(❌)
前提:连通
-
边稀疏时,采用kruskal算法求最小生成树;边稠密时,采用prim算法
-
借助深度优先搜索求AOE网的关键路径。(❌)
三、查找
-
折半查找,在等概率的情况下查找成功的平均时间复杂度是O(logn)
-
二叉排序树的查找中,创建平衡二叉排序的目的是提高查找时间效率
-
哈希查找属于动态表上的查找法
-
对于二叉排序树,中序遍历的关键字序列一定是有序的。
-
有序的单链表上不适合折半查找
-
对于相同的关键字集,如果不同的初始序列,那么创建的二叉排序树也不相同。(❌)
有可能相同,也有可能不同
-
线性探测法解决冲突时,同义词在散列表中不一定相邻
-
基于比较运算的查找算法,其时间复杂度的下界为O(logn)
-
分块查找时,数据的组织方式为数据分成若干块,每块(除最后一块外)中的数据个数需相同。(❌)
四、排序
-
基数排序是稳定的。
-
直接插入排序的时间效率与关键字的初始序列有直接关系。
-
表插入排序可以避免元素的移动,并且需要额外的空间。
-
假设待排序的表长为n,那么创建堆需要时间复杂度为O(n)
-
进行增序排序,需要使用大根堆(存疑)
-
如果关键字序列采用单链表存储,那么基数排序的过程可以避免大量数据移动
五、数组与广义表
- 不能对数据元素进行随机访问的物理结构是:三元组顺序表
- 对稀疏矩阵进行压缩的方法一般有两种:三元组顺序表和十字链表
- 数组的基本操作有存取、修改、检索和排序等,没有插入和删除操作
- 三元组顺序表或十字链表作为稀疏矩阵中的物理结构,对元素的访问形式只能是:顺序访问
- 广义表的表头不一定是广义表,表尾一定是广义表
六、栈和队列
- 注意栈的出栈的顺序
- 只有表头指针没有表尾指针的循环单链表不适合作为链栈的链表
- 循环队列,为了方便确定是满队列还是空队列,一般都会留一个位置不放元素
- 队列和栈都适合使用带表尾节点指针的循环单链表
七、线性表
- 某线性表最常用的操作是在尾元素之后插入一个元素和删除尾元素,循环双链表存储方式最节省运算时间
- 双链表,循环双链表,单链表,循环单链表
八、绪论
-
算法必须具备输入、输出、可行性、有穷性和确定性
-
时间复杂度通常是指最坏情况下,估计算法执行时间的一个上限
-
分析时间复杂度
循环中的 i*=2与i+=2 导致的最后的复杂度不一样