树与二叉树的应用
二叉树排序树(BST)查找树
若左子树非空,则左子树上所有结点关键字值均小于根结点的关键字值。
若右子树非空,则右子树上所有结点关键字值均大于根结点的关键字值。
平衡二叉树:左右子树都是平衡二叉树,高度差绝对值不超过1;
哈夫曼树:
结点为权,从树根结点到任意结点的路径长度(经过的变数)与该结点s
哈夫曼树:
结点成为权,从根结点到任意结点的路径长度(经过的边数)与该结点上权值的乘积成为该结点的带权路径长度。
带权路径长度最小的二叉树称为哈夫曼树也称最优二叉树。
构造:每个初始结点最终成为叶结点,权值越小的结点到根结点的路径长度越大。
构造过程中共新建n-1个结点,哈夫曼中结点总数为2n-1。
前缀编码的判断:一串字符不是另一串字符的前缀。
度为m的哈夫曼树中,叶子结点个数为n,则非叶子结点的个数为(n-1)/(m-1)
图
图G是由顶点集V和边集E组成,记G=(V,E);不能为空图(顶点集不为空,边集可以为空);
有向图:边集E是有向的(弧)G为有向
无向图:E是无向边;
简单图:不存在重复边,不存在顶点到自身的边。
多重图:某两结点之间的边数多于一条,又允许顶点通过同一条边和自己关联。
完全图(简单完全图):在无向图中,任意两个顶点之间都存在边,则称该无向完全图。含有n个顶点的无向完全图有n(n-1)/2条边。
有向完全图有n(n-1)条边;
无向图中:顶点度n等于2e(边)
有向图:入度+出度=顶点的度 =边数
路径上边的数目称为路径长度。第一个顶点和最后一个顶点相同的路径称为回路或环,n个顶点,有大于n-1条边,一定有环。
连通的无向图至少有n-1条边,强连通有向图边数n。
各顶点的度是矩阵中此结点对应的行(出度)列(入度)
-----邻接矩阵:顺序存储,一维数组存储图中顶点的信息,二维数组存储途中边的信息;
无向图的邻接矩阵是对称矩阵,第i行非零元素的个数正好是第i个顶点的度。
带权有向图得邻接矩阵,第Vi得入度等于第i列非无穷且非0得元素个数。
-----邻接表:链式存储,
如果G为无向图,则所需存储空间为O(|V|+2|E|);如果G为有向图,则所需的存储空间为O(|V|+|E|),无向图中,每条边会出现两次。 邻接表中,给定一个顶点很容易查到它的所有邻边,在邻接矩阵中需要扫描一行,时间为O(n),如果要确定给定的两个顶点间是否存在边,则在邻接矩阵中可以立即查到,在邻接表中则需要在相应结点中查找另一结点,效率较低。
n个顶点得无向图得邻接表最多有
-----十字链表
十字链表是有向图的一种链式存储结构,在十字链表中,对应于每条弧有一个结点,对应于每个顶点也有一个结点。
-----邻接多重表
邻接多重表是无向图的另一种链式存储结构,与十字链表类似,每一条边用一个结点表示
mark | ivex | ilink | jvex | jlink | info
mark 为标志域,标记该条边是否被搜索过;ivex和jvex分别表示该边依附的两个顶点,ilink指向下一条依附于ivex的边,jlink指向下一条依附于顶点jvex的边,info为指向和边相关的各种信息的指针域。
每一个顶点也用一个结点表示,由如下所示的两个域组成
data | firstedge
每一条边只有一个结点
------图得遍历-----
---------广度优先遍历
广度优先遍历类似于二叉树得层次遍历算法。
性能分析:无论是邻接表还是邻接矩阵的存储方式,BFS算法都需要借助一个辅助队列Q,n个顶点都需入队一次,在最坏的情况下,空间复杂度为O(|V|)
采用邻接表存储时,每个顶点均需搜索一次(或入队一次),故时间复杂度为O(|V|),在搜索任一顶点的邻接点时,每条边至少访问一次,故时间复杂度为O(|E|),算法总的时间复杂度为O(|V|+|E|).当采用邻接矩阵存储时,查找每个顶点的邻接点所需时间为O(|V|),故算法总的时间复杂度为O(|V|^2)。
可以使用BFS算法求解单源最短路径。
给定图的邻接矩阵存储表示是唯一的,故其广度优先生成树也是唯一的,但由于邻接表存储表示不唯一,故其广度优先生成树也是不唯一的。
---------深度优先遍历(~树的先序遍历)
DFS算法的性能分析:
是一个递归算法,需要借助递归工作栈,空间复杂度为O(|V|);遍历图的过程实质上是对每个顶点查找其邻接点的过程,其耗费的时间取决于采用的存储结构。以邻接矩阵表示,查找每个顶点的邻接点的所需时间为O(|V|),故总的时间复杂度为O(|V|^2).以邻接表表示时,查找所有顶点的邻接点所需时间为O(|E|),访问顶点所需时间为O(|V|),总的时间复杂度为O(|V|+|E|);
*同一个图基于邻接矩阵的遍历所得到的DFS序列和BFS序列是唯一的,基于邻接表的遍历所得到的bfs和dfs是不唯一的(因为邻接矩阵唯一,而邻接表表示不唯一)
图的应用
------拓扑排序
有向无环图:一个有向图中不存在环;DAG
拓扑序列:由一个有向无环图的顶点组成的序列,
条件:每个顶点出现且只出现一次;若顶点A在序列中排在顶点B的前面,则图中不存在从顶点B到顶点A的路径;
寻找没有前驱的顶点,输出每个顶点的同时还要删除以它为起点的边,时间复杂度为O(v+e);
------关键路径
AOE网:带权有向图,以顶点表示事件,有向边表示活动,边上权值表示完成该活动的开销
性质:只有在某顶点所代表的事件发生后,从该顶点出发的各有向边才能开始活动;只有在进入某一顶点的各有向边所代表的活动都结束后,才可以开始该顶点的事件。
最早发生时间ve(k):开始顶点到V的最长路径长度;最早开始时间决定了所有从v开始的点能够开工的最早时间。
最迟发生时间vl(k):不推迟整个工程下,v在ve(i)时刻能够发生时,该事件最迟必须发生的时间。
最早开始时间:该活动的起点所表示的事件最早发生时间。
最迟开始时间:活动的终点事件最迟发生时间与该活动所需时间之差