- 树是n个结点的有限集合,N=0时,称空树
- 树有且仅有一个跟结点
- 根结点无前驱,其余结点有且仅有一个前驱,可有0个或者多个后继
- 从K可到A,说,K是祖先,A是子孙;从K一下就到A,说,K是双亲结点(父结点);来自同一个双亲,说,是兄弟结点。
- 度:子结点数目
- 结点的层次、高度、深度、树的高度(深度)
- 有序树和无序树
二叉树
- 二叉树不是一般树的特殊情况
- N2-1=N0
图
图G又定点集V和边集E组成,记G=(V,E)。
顶点集表示:V={v1,v2,v3…} ,|V|为顶点的个数,或图G的阶。
边集表示:E={e1,e2,e3…}, |E|为边的个数。
图不可以为空——图不可以没有顶点,但是可以没有边
有向图 E1={<v1,v2>,<v2,v3>} 点1指向点2,点2指向点3
无向图E2={(v1,v2),(v2,v3)}点之间仅有连线,没有指向
简单图:
{
1、不存在重复边
2、不存在顶点到自身的边
}
多重图:两点之间的边数大于1
完全图:两个顶点之间都存在边
子图
连通:无向图中,两点有路径存在。
连通图:任意两点之间连通。
连通分量:无向图中的极大连通子图,称为连通分量。(如果一个图有n个顶点,并且小于n-1条边,则必定非连通!)
生成树:包含全部顶点的极小连通子图。
强连通:有向图中,两点之间互相有路径,则两点强连通。
强连通图:任意两点强连通。
顶点的度:该顶点为一个端点的边的数目(无向图中,顶点v的度是依附于该顶点的边的条数)
边上可以带权,带权的图也称为网
边数很少的图——稀疏图(|E|<|V|*log|V|),反之是稠密图
路径是两点之间的路径,路径长度是路径中的边数,第一个顶点和最后一个顶点相同的路径称为回路或者环
图的储存以及基本操作
1、邻接矩阵法(无向图、有向图、网都可以的;适合稠密图;容易确定任意两点是否有边,但确定图中的边数需要遍历全体,代价高;空间复杂度是O(n^2))
2、邻接表法(适合稀疏图;对于给顶点,容易找出其对应邻边,但确定两个点之间是否存在边,需要再查找另一点「邻接矩阵法则不用」;)
3、十字链表法(有向图的)不仅可以像邻接表一样,还可以像逆邻接表一样
4、邻接多重表(无向图的)
图的遍历
(借助队列)1、广度优先遍历(Breadth-First-Search)BFS
使用邻接表储存时,一个顶点空间复杂度O(|V|),时间复杂度O(|E|),总的时间复杂度O(|V|+|E|);若采用邻接矩阵的储存方式,一个顶点时间复杂度O(|V|),总的O(|V|2)
(借助栈)2、深度优先遍历(Deepth-First-Search)DFS
图的应用
一、求最小生成树:包含所有顶点,但是有最少的边
法一:prim算法(名字短,所以算法也从局部开始)
1、找最小权值的两点连通作为起始点
2、两点连通后所拥有的最小权值作为下一对连通点
。。。。。。
ps:不能生成环
法二、Kruskal算法(名字长,算法也从全局开始)
1、全局最短,进行连通
2、第二短。。。。。。
ps:同样不能生成环
二、求最短路径:求某个原点到各个顶点的最小路径
法一:Dijkstra(基于贪心策略,每次连通,都计算出下一步的所有长度)
法二:Floyd(路由器寻址)都走一遍,记录所有最优路径
三、拓扑排序
【有向无环图】一个有向图中不存在环
【AOV网】如用有向无环图表示一个工程,用<vi,vj>表示vi与vj之间存在的前驱后继关系,将这种有向图称之为<顶点表示活动的网络>AOE网。
【拓扑排序】1、每个定点出现且出现一次;2、若顶点A排序排在B的前面,则图中不存在B->A;
(可借助栈了避免重复比较)【拓扑排序算法】1、选择一个没有前驱的点输出;2、删除该点及以它为起点的边;3、重复12,若当前图为空或者不存在无前驱的点就停止,而后一种情况说明有环。
四、关键路径
【AOE网】带权有向图中,顶点表示时间,有向边表示活动,边上的权值表示活动的开销,则成这种有向图为用边表示活动的网络,AOE网。
有些活动可以并行的,从源点到汇点的路可能有多条,并且可能长度还不一样。尽管时间不同,但是只有完成了所有,整个工程才算是完成了。
「所以」从源点到汇点的所有路径中,最大路径长度的路程称为【关键路径】,关键路径上的活动称之为【关键活动】。