请问线性表的删除算法的平均时间复杂度,为什么他这里是算从移动1次到n次,不是应该从1到n-1吗

1.对于线性结构乃至整个数据结构課程的学习都是非常重要的是进行算法设计的基础。

2.本章重点是顺序表和链表上实现的各种基本算法及相关的时间和空间性能分析难點是能够使用本章所学到的基本知识设计有效算法解决与线性表相关的应用问题。

二、线性表的顺序存储结构

三、线性表的链式存储结构

(②)其他形式的链表:循环链表、双向链表

(三)顺序表和链表的比较

线性表是一种最简单的线性结构

1.线性表的基本特征:

线性结构是一个数据え素的有序(次序)集

(1)集合中必存在唯一的一个“第一元素”;

(2)集合中必存在唯一的一个“最后元素;

(3)除最后元素在外,均有唯一的后继;

(4)除第一元素之外均有唯一的前驱。

2.抽象数据类型线性表的定义:

{称n为线性表的表长;

称n=0时的线性表为空表

称i为a_i茬线性表中的位序。 }

只有在初始化操作销毁操作和加工型操作中有 “&” (引用操作符)

操作结果:构造一个空的线性表L。

初始条件:线性表L已存在

操作结果:销毁线性表L。

初始条件:线性表L已存在visit()为某个访问函数

操作结果:依次对L中每个元素调用函数visit()。一旦visit()失败则操作失败。

  假设:有两个集合A和B分别用两个线性表LA和LB表示即:线性表中的数据元素即为集合中的成员。现要求一个新的集匼A=A U B

要求对线性表作如下操作:

扩大线性表LA,将存在于线性表LB中而不存在线性表LA中的数据元素插入到线性表LA中去

  (1)从线性表LB中依次查看每個数据元素;

  //La中不存在和e相同的数据元素,则插入之

若线性表中的数据元素相互之间可以计较并且数据元素在表中依值非递减或非递增囿序排列,即a_i≥a_i-1或a_i≤a_i-1(i=2,3,...,n),  (见图一(3))则称该为有序表

归并两个“其数据元素按值非递减有序排列”的有序表LA和LB,求得有序表LC也具有同样特性

(1)初始化LC为空表;

(3)若ai≤bi,则将ai插入LC中否则将bj插入到LC中;

(4)重复2和3步骤,直到LA或LB中元素被取完为止;

(5)将LA表或LB表中剩余元素复制插入到LC表Φ

}//插入la表中剩余元素

}//插入lb表中剩余元素

二、线性表的顺序存储结构

1.顺序映像:以X的存储位置和y的存储位置之间某种关系表示逻辑关系<x,y>

最簡单的一种顺序映像方法是:

令y的存储位置和x的存储位置相邻。

用一组地址连续的存储单元依次存放线性表中的元素

线性表的其实地址稱作线性表的基地址

所有数据元素的存储位置均取决于第一个数据元素的存储位置。

  存取结构:与存储结构是两个不同的概念

  存取结构昰在一个数据结构上对查找操作的时间性能的一种描述。

  通常有两种存取结构:随机存取结构和顺序存取结构

  随机存取结构是指在一个數据结构上进行查找的时间性能是O(1),即查找任意一个数据元素的时间是相等的,均为常数时间例如顺序表是一种随机存取结构。

  顺序存取結构是指在一个数据结构上进行查找的时间性能是O(n)即查找一个数据元素的时间复杂度是线性的,与该元素在结构中的位置有关例如单鏈表是一种顺序存取结构。

2.顺序映像的C语言描述

线性表的静态分配顺序存储结构:

在线性表的静态分配序列存储结构中线性表的最多数據元素个数为LISTSIZE,元素数量不能随意增加这是以数组方式描述线性表的缺点。

为了实现线性表最大存储数据元素数可随意变化可以使用┅个动态分配的数组来取代上面的固定长度数组如下描述

线性表的动态分配顺序存储结构:

3.线性表的基本操作在顺序表中的实现

构造一个涳表这对表是一个加工型的运算,因此将L设为引用参数,首先动态分配存储空间然后,将length置为0表示表中没有数据元素。

线性表中的按值查找是指在线性表中查找与给定值x相等的数据元素

顺序表中完成该运算最简单的方法是:从第一个元素a1,起依次和x比较直到找到┅个与x相等的数据元素,则返回它在顺序表中的存储下标或序号(二者差1);或者查遍整个表都没有找到与x相等的元素返回ERROR

本算法的主偠运算是比较,显然比较的次数与x在表中的位置有关也与表长有关,当a1=x时比较1次成功,当an=x时比较n次成功按值查找的平均比较次数为(n+1)/2,时间性能为O(n)

//在顺序表L的第i个元素之前插入新的元素e,

考虑移动元素的平均情况:

假设在第i个元素之前插入的概率为pi则在长度为n嘚线性表中插入第一个元素所需移动元素次数的期望值为:图一(5)

若假设在线性表中任何一个位置上进行插入的概率都相等,则移动元素的期望值为:图一(6)

假设删除第i个元素的概率为qi则在长度为n的线性表中删除一个元素所需要移动元素次数的期望值为:图一(7)

若假定在線性表中任何一个位置上进行删除的概率都是相等的,则移动元素的期望值为:图一(8)

三、线性表的链式存储结构

用一组地址任意的存儲单元存放线性表中的数据元素

以元素(数据元素的映像)+指针(指示后继元素存储位置)=结点(表示数据元素或数据元素的映像)

以“结点的序列”表示线性表————称作链表

以线性表中第一个数据元素a1的存储地址作为线性表的地址,称作线性表的头指针

为方便在苐一个结点前虚加一个“头结点”,以指向头结点的指针为链表的头指针

线性表为空表时,头结点的指针域为空

1.头指针是指链表指向苐一个结点的指针,若链表有头结点则是指向头结点的指针;

2.头指针具有标识作用,所以常用头指针冠以链表的名字;

3.头指针是链表的必要元素

1.头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前其数据域一般无意义(也可存放链表的长度);

2.有了头結点,对在第一元素结点前插入结点和删除第一结点其操作与其他结点的操作就统一了;

3.头结点不一定是链表的必要元素。

结点和单链表的C语言描述

//L是带头结点链表的头指针e返回第i个元素

j=1; //p指向第1个结点,j为计数器

} //顺指针向后查找直到p指向第i个元素或p为空

(2)ListInsert(&L,i,e)的实现:在链表中插入结点只需要修改指针,同时若要在第i个结点之前插入元素修改的是第i-1个结点的指针。

前插结点:设p指向链表中某结点s指向待插入的值为x的新结点,将*s插入到*p的前面与后插不同的是:首先要找到*p的前驱*q,然后再完成在*q之后插入*s设单链表头指针为L。操作如下:

湔插操作因为要找*p的前驱时间性能为O(n).

其实前插操作可以用后插操作来实现,即仍然可以将*s插入到*p的后面然后将p->data与s->data交换即可。其时间复雜度为O(1)

在单链表中删除第i个节点的基本操作为:找到线性表中第i-1个结点修改其指向后继的指针。

}//寻找第i-1个结点并令p指向其前驱

(5)如何从線性表得到单链表?

链表是一个动态的结构它不需要予分配空间,因此生成链表的过程是一个结点“逐个插入”的过程

头插法:逆位序输入n个数据元素的值,建立带头结点的单链表

操作步骤:建立一个空表,输入数据元素a_n,建立结点并插入输入数据元素a_n-1,建立结点并插入直至到a1

①正序输入m个数据元素的值,建立不带头结点的单链表

L=s; //其第一个结点的处理

②建立带头结点的单链表

a.由于开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作就和在表的其他位置上的操作一致无需进行特殊处理;

b.无论链表是否为涳,其头指针指向头结点的非空指针(空表中头结点的指针域为空)因此空表和非空表的处理也统一了。

循环链表:最后一个结点的指針域的指针又指回第一个结点的链表

和单链表的差别仅在于判别链表中最后一个结点的条件不再是“后继是否为空”,而是“后继是否為头结点”

(1)对于单链表只能从头结点开始遍历整个链表,而对于单循环链表则可以从表中任意结点开始遍历整个链表

(2)有时对链表常做嘚操作是在表尾、表头进行,此时可以改变一下链表的标识方法不用头指针而用一个指向尾结点的指针R来标识,可以使得操作效率得以提高

(3)在做链表合并和分裂时,如果不是必须从链表表头开始则可以直接在链表指针处合并,时间复杂度可达O(1)

特点:“查询”和单链表相同,“插入”和“删除”时同时修改两个方向上的指针

从某个结点出发到其直接前趋结点或直接后继结点,时间复杂度均为O(1)

查找苐i个结点,向第i个结点插入或删除第i个结点都要区分是哪个方向

如果是双向循环链表,修改指针要同时考虑在前趋环链和后继环链上的修改

某个结点的直接前趋的直接后继,或它的直接后继的直接前趋即为该结点本身。

借助数组来描述线性表的链式存储结构结点也囿数据域data和指针域next,与之前的链表中的指针不同的是这里的指针是结点的相对地址(数组的下标),称之为静态指针

线性表的静态单鏈表存储结构:

静态链表适用于不支持“指针”的高级语言,或者最大元素数固定但插入、删除操作频繁的链表应用中有关基于静态链表上的线性表的操作基本与动态链表相同,除了一些描述方法有些区别外算法思路是相同的。

特点:所有数据元素均存储在一个连续的涳间段但是相邻两个元素不一定处于相邻的空间

修改指针域即可完成插入和删除操作,不需要移动数据元素但是也不能随机访问 静态鏈表中的元素

一次性分配所有存储空间,插入、删除时无需再向操作系统申请或释放空间但也限制了最大表长。

方法简单各种高级语訁中都有数组,容易实现

不用为表示结点间的逻辑关系而增加额外的存储开销。

顺序表具有按元素序号随机访问的特点

在顺序表中做插叺删除操作时平均移动大约表中一半元素,因此对n较大的顺序表效率低

需要预先分配足够大的存储空间,估计过大可能会导致顺序表后部大量闲置,分配过小又会造成溢出。

链表的优缺点恰好和顺序表相反

缺点:1.必须要有指针 2.顺序访问 3.需借助指针表述逻辑关系

优點:1.插入删除效率高 2.动态分布

顺序表在程序执行之前必须明确规定它的存储规模,事先对“MAXSIZE”有合适的设定过大浪费,过小溢出(不宜采用顺序表)

链表不用事先估计存储规模,但链表的存储密度较低小于1.

在顺序表中按序号访问a_i的时间性能是O(1),而链表中按序号访问的时間性能是O(n),所以如果经常做的运算是按序号访问数据元素,显然顺序表优于链表;而在顺序表中做插入删除时,平均移动表中一半的元素当数据元素的信息量较大且表较长时,这一点不能忽视在链表中插入,删除虽然也要找插入位置但操作主要是比较操作,要优于湔者。

顺序表容易实现任何高级语言中都有数组类型,链表的操作是基于指针的相对前者简单。

通常“较稳定”的线性表选择顺序存儲频繁做插入删除的,动态性较强的线性表宜选择链式存储

了解线性表的逻辑结构特性是数据元素之间存在着线性关系,在计算机中表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构

熟练掌握两类存储结构的描述方法以及线性表的各种基本操作的实現,重点掌握:初始化查找,插入删除,遍历逆置,合并分解等操作。

从时间和空间复杂度的角度综合比较线性表两种存储结构嘚不同特点及其适用场合

1.采用顺序存储结构的线性表的插入算法中当n个空间已满时,可申请再增加分配m个空间若申请失败,则说明系統没有( D )可分配的存储空间

2.循环链表的主要优点是( D )。

A.不再需要头指针了 B.已知某个结点的位置后,能很容易找到它的直接前驱结点

C.在进荇删除操作后,能保证链表不断开 D.从表中任一结点出发都能遍历整个链表。

3.若线性表最常用的运算是查找第i个元素及其前驱的值则采鼡( D )存储方式节省时间。

4.若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素则采用( D )存储方式最节省运算时間。

A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表

5.在具有n个结点的单链表中实现( A )的操作,其算法的时间复杂度都是0(n)

A. 遍历链表和求链表的第i个结点 B.在地址为p的结点之后插入-一个结点 C. 删除开始结点 D. 删除地址为p的结点的后继结点

6.在n个结点的顺序表,算法的时間复杂度是0(1)的操作是( A )

A.访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n) B.在第i个结点后插入一个新结点(1≤i≤n)

C.删除第i个结点(1≤i≤n) D.将n个结点从大箌小排序

7.在一个长度为n (n>1)的带头结点的单链表h上,另设有尾指针r(指向尾结点)执行( B )操作与链表的长度有关。

A.删除单链表中的第一一个元素 B.删除单链表中的最后一个元素 C.在单链表第一个元素前插入-一个新元素 D.在单链表最后一个元素后插入一个新元素

A.删除单链表中的第一个元素操作过程:

B.删除单链表中的最后一个元素,操作过程:

C.在单链表第一个元素前插入-一个新元素操作过程:

D.在单链表最后一个元素后插入-一个新え素,操作过程:

8.在非空循环双链表中q所指的结点前插入一个由p所指结点的过程依次为:

分析:(1)算法的目标是分析两个表的大小则算法中不應当破坏原表;

(2)按题意,表的大小指的是“词典次序”则不应当先比较两个表的长度;

(3)算法中的基本操作为:同步比较两个表中相应的数据元素。

10.删除有序表中所有其值大于mink且小于maxk的数据元素

12.将两个非递减有序的有序表归并为非递增的有序链表(利用原表结点)

2)依次从La或Lb中“摘取”元素值较小的结点插入到Lc表中第一个结点之前直至其中个表变空为止;

3)继续将La或Lb其中一个表的剩余结点插入在Lc表的表头结点之后;

4)释放La表和Lb表的表头结点。

//将非递减的有序表La和Lb归并为非递增的

//有序表Lc,归并之后La和Lb表不再存在。

// 上述三个表均为带头结点的单链表Lc表

//中的结点即為原La或Lb表中的结点。

13.已知AB和C为三个有序链表,编写算法从A表中删除B表和C表中共有的数据元素

//La,Lb,LC分别为三个非递减有序的单链表的头指针從La表中删除所有的在Lb和LC中表现出来的元素结点

}//删除,注意没有移动pb和pc才能实现删除所有满足条件的结点

14.在双向循环链表的结点中增加一個访问频度的数据域freq,编写算法实现LOCATE(L,x)。

(2)在访问频度freq增1之后需将该结点调整到适当位置。向前搜索直至找到一个访问频度大于它的结点为止

将结点*p从当前位置上删除;

之后将结点*p插入在结点*q之后;

15.已知L为没有头结点的单链表中第一个结点的指针,每个结点数据域存放一个字苻该字符可能是英文字母字符或数字字符或其它字符,编写算法构造三个以带头结点的单循环链表表示的线性表使每个表中只含同一類字符。( 要求用最少的时间和最少的空间)

lo->next=lo; //建立三个链表的头结点并置三个循环链表为空表

16、已知数组A[1...n]的元素 类型为整型int,设计一个时间和涳间上尽可能高效的算法,将其调整为左右两部分左边所有元素为奇数,右边所有元素为偶数

(1)给出算法的基本设计思想;

(2)根据设计思想,采用C或C++表述算法关键之处给出注释;

(3)说明你所设计算法的时间复杂度和空间复杂度。

分析:本题主要考查线性表的顺序存储结构(这里为数組)的应用算法的基本设计思想是设置两个指示器i和j,其中i=1j=n;当A[i]为偶数,A[j]为奇数时

A[i]和A[j]交换; 否则,A[i]为奇数时则i++; A[y]为偶数时,则j--这样,可使算法的时间复杂度为O(n)

线性表(an, a2, a3, ... ap)采用顺序存储,每个元素都是整数试设计算法用最少时间把所有值为负数的元素移到全部正数值元素前邊的算法。

将顺序表(a1, a2, ... an) 重新排列为以a,为界的两部分: a, 前面的值均比a1小a,后面的值都比a大(这里假设数据元素的类型具有可比性,不妨设为整型)这一操作称为划分。

}

1.数据的逻辑结构是从 逻辑 关系上描述数据它与数据的 具体存储 无关,是独立于计算机的
3.栈顶的位置是随着 入栈出栈 操作而变化的。

第二个t为首的有t、tu、tur、ture4个一共是12個不需要去掉 5.假设一个9阶的上三角矩阵A按列优先顺序压缩存储在一堆数组B中、其中B[0]存储矩阵中第一个元素a[1][1],则B[31]中存放的元素是 a[4][8]

九阶:9*9上三角:非零元素在右上半部分按列:1+2+3+4+5+6+7=28个,第一列存储1个第二列存储2个,以此类推第8列需要存储四个(31+1-28=4)。B[0~31]共32个故答案是a(4,8)。第四行第8列 6.已知一棵完全二叉树中共有768结点,则该树中共有 384 个叶子结点和 1 个只具有左孩子的结点和 0 个只具有右孩子的结点


8.在单链表上难以实现的排序方法有 快速排序堆排序
9.在有序表(12,24,36,48,60,72,84)中二分查找关键字72时所需进行的关键字比较次数为:

第一次二分查找取序列中间值48比较72>48
第二次查找取48右侧的子序列60,72,84的中值72,比较72==72返回。查找完成
10.对于一棵具有n个结点的二叉树用二叉链表存储时,其指针总数为 2n 个, n+1个指针是空闲的有 n-1 指向孩子结点。


n个节点则有2n个链域除了根节点没有被lchild和rchild指向,其余的节点必然会被指到所以指针总数为2n个,指向了孩子节点的指針则为n-1个因为n个节点的二叉树,除根结点以外都有自己的父亲结点或者说其都是一个孩子节点所以有n-1个指针指向他们。那剩下的就是涳闲指针了共有2n-(n-1)=n+1个。

11.若对一棵完全二叉树从0开始进行结点的编号并按此编号把它顺序存储到一堆数组A中,即编号为0的结点存储到A[0]中其余类推。则A[i]元素的左孩子元素为 A[2i+1] 右孩子元素为 A[2i+2] ,双亲元素为 A[(i-1)/2]

12.在一个具有n个顶点的无向完全图中,包含有 n(n-1)/2 条边在一个具有n个顶點的有向完全图中包含有 n(n-1) 条边。
定义:具有n个顶点和n(n-1)/2条边的无向图称为完全无向图具有n个顶点,n(n-1)条弧的有向图称为完全有向图完铨无向图和完全有向图都称为完全图。显然完全图具有最多的边数,即任意一对顶点间均有边或弧相连

13.在所有内部排序算法中,速度朂快的是 快速排序

1.算法指的是( D 解决问题的有限运算序列 )。
2.线性表采用链式存储时结点的存储地址( B 连续与否均可
3.将长度为n的单鏈表接在长度为m的单链表之后的算法的时间复杂度为( C O(m)
4.由两个栈共享一个向量空间的好处是:( B 节省存储空间,降低上溢发生的机率
双向栈——两个栈共享同一存储空间
当程序中同时使用两个栈时可以将两个栈的栈底设在向量空间的两端,让两个栈各自向中间延伸如下图所示:当一个栈的元素较多,超过向量空间的一半时只要另一个栈的元素不多,那么前者就可以占用后者的部分存储空间呮有当整个向量空间被两个栈占满(即两个栈顶相遇)时,才会发生上溢因此两个栈共享一个长度为m的向量空间

5.设有如下遗产继承规则:丈夫和妻子可以互相继承遗产;子女可以继承父亲或母亲的遗产;子女间不能相互继承。表示该遗产继承关系最适合的数据结构应该是( B
6.在数据结构中从逻辑上可以把数据结构分成( C 线性结构和非线性结构
7.以下数据结构中不属于线性数据结构的是( C 二叉树
8.算法嘚时间复杂度是指( C 算法执行过程中所需要的基本运算次数
9.哈夫曼树是( C 树的路径长度最短的二叉树?可能有问题,我最后这套试卷不是滿分
10.由带权9,1,3,5,6的五个叶子结点生成的哈夫曼树的带权路径长度为( C 52
①有n棵权值分别为w1,w2,,wn的二叉树将其组合成一个森林集合F={T1,T2,Tn},其中每棵二叉树Ti中都只有一个权值为wi的根节点其左右孩子为空。
②在森林F中选出两棵根节点的权值最小的树将这两棵树合并为一棵新树,为了保證新树仍是二叉树需要增加一个新结点作为新树的根,并将所选的两棵树的根分别作为新树的左、右孩子不用区分先后,将左、右孩孓的权值之和作为新树根的权值
③对新的森林集合F重复步骤②,直到森林F中只剩下一棵树为止最后生成的二叉树为哈夫曼树。

11.深度为k嘚完全二叉树所含叶子结点的个数最多为( C 2^(K-1)
12.具有10个叶结点的二叉树中有( B 9 )个度为2的结点
公式:对任何一棵二叉树,如果叶子结点数為n0度为2的结点数为n2,则一定有n0=n2+1所以n2=n0-1=9。

1.对于给定的五个实数w={8,5,13,2,6},试构造哈夫曼树并求出该树的最小带权路径长度。

2.已知一个无向图的顶点集为{a,b,c,d,e}其邻接矩阵如下所示
(1)画出该图的图形;
(2)根据邻接矩阵从顶点a出发进行深度优先遍历和广度优先遍历,写出相应的遍历序列

邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图其中V={v1,v2,…,vn} [1] 。G的邻接矩阵是一个具有下列性质的n阶方阵:
①对无向图而言邻接矩阵一定是对称的,而且主对角线一定为零(在此仅讨论无向简单图)副对角线不一定为0,有向图则不一定如此
②在无向图中,任┅顶点i的度为第i列(或第i行)所有非零元素的个数在有向图中顶点i的出度为第i行所有非零元素的个数,而入度为第i列所有非零元素的个數
③用邻接矩阵法表示图共需要n^2个空间,由于无向图的邻接矩阵一定具有对称关系所以扣除对角线为零外,仅需要存储上三角形或下彡角形的数据即可因此仅需要n(n-1)/2个空间。
在图的邻接矩阵表示法中:
① 用邻接矩阵表示顶点间的相邻关系
② 用一个顺序表来存储顶点信息
设G=(VE)是具有n个顶点的图,则G的邻接矩阵是具有如下性质的n阶方阵:

下图中无向图G 5 和有向图G 6 的邻接矩阵分别为A1 和A 2

若G是网络,则邻接矩陣可定义为:

w ij 表示边上的权值;
∞表示一个计算机允许的、大于所有边上权值的数
【例】下面带权图的两种邻接矩阵分别为A 3 和A 4 。

二叉树深喥优先遍历和广度优先遍历

对于一颗二叉树深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支以上面二叉树为例,深度优先搜索的顺序
为:ABDECFG怎么实现这个顺序呢 ?深度优先搜索二叉树是先访问根结点然后遍历左子树接着是遍历右子树,因此我们鈳以利用堆栈的先进后出的特点
现将右子树压栈,再将左子树压栈这样左子树就位于栈顶,可以保证结点的左子树先与右子树被遍历
  广度优先搜索(Breadth First Search),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历上面二叉树的遍历顺序为:ABCDEFG.
可以利用队列实现广度优先搜索。

3.已知一个图的顶点集V和边集E分别为:
(2)用布鲁斯卡尔算法得到最小生成树试写出在最小生成树中依次得到的各條边。


自己的感想:如果是v1、v2、v3···用下标不是直接用值。

  邻接表存储的基本思想:对于图的每个顶点vi将所有邻接于vi的顶点链成┅个单链表,称为顶点vi的边表(对于有向图则称为出边表)所有边表的头指针和存储顶点信息的一维数组构成了顶点表。
  邻接表有兩种结点结构:顶点表结点和边表结点.

顶点表                  边表
                          
  其中:vertex:数据域,存放顶点信息 firstedge:指针域,指向边表中第一个结点 adjvex:邻接点域,边的终点在顶点表中的下标 next:指针域,指向边表中的下一个结点
顶点;最高点;<数>(三角形、圆锥体等与底相对的)顶;(三角形、多边形等的)角的顶点

若是有向图,邻接表的结构是类似的如图7-4-7,以顶点作为弧尾来存储边表容易得到每个顶点的出度而以顶点为弧头的表容易得到顶点的入度,即逆邻接表

对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域存储权值信息即可,如图7-4-8所示

克鲁斯卡尔算法的基本思想是以边為主导地位,始终选择当前可用(所选的边不能构成回路)的最小权植边所以Kruskal算法的第一步是给所有的边按照从小到大的顺序排序。这┅步可以直接使用库函数qsort或者sort接下来从小到大依次考察每一条边(u,v)


<1> 设一个有n个顶点的连通网络为G(V,E),最初先构造一个只有n个頂点没有边的非连通图T={V,空},图中每个顶点自成一格连通分量
<2> 在E中选择一条具有最小权植的边时,若该边的两个顶点落在不同的连通分量上则将此边加入到T中;否则,即这条边的两个顶点落到同一连通分量上则将此边舍去(此后永不选用这条边),重新选择一條权植最小的边
<3> 如此重复下去,直到所有顶点在同一连通分量上为止

后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历、后序周遊可记做左右根。后序遍历有递归算法和非递归算法两种在二叉树中,先左后右再根即首先遍历左子树,然后遍历右子树最后访問根结点。
后序遍历首先遍历左子树然后遍历右子树,最后访问根结点在遍历左、右子树时,仍然先遍历左子树然后遍历右子树,朂后遍历根结点即:

若二叉树为空则结束返回,
(1)后序遍历左子树(2)后序遍历右子树(3)访问根结点
后序遍历结果:DEBFCA
已知前序遍历囷中序遍历就能确定后序遍历。 [1]
1、先序遍历(根左右)
先序遍历先从二叉树的根开始然后到左子树,再到右子树,如图


先序遍历序列昰ABDCEF,重点是记住第一个字母“A”是根出发点是根“A”

2、中序遍历(左根右)
中序遍历先从左子树开始,然后到根再到右子树,如图3

即Φ序遍历序列是DBAECF重点是记住中序遍历的根位置,是在序列的第一个字母和最 后一个字母之间出发点是左子树的最下边的左边的开始,(为什么到A之后直接跳过C呢因为C也是E和F的根,所以按照中序遍历规律先到E再到C再到F)

3、后序遍历(左右根)
后序遍历先从左子树开始,然后到右子树再到根,如图

即后序遍历序列式DBECFCA,重点是知道了根是最后面一个字母“A” 出发点是左子树的最下边左边。

四、道了先序遍历和中序遍历或者是后序遍历和中序遍历,判断出后序遍历或者是先序遍历的方法
比如知道先序遍历是ABDCEF,中序遍历是DBAECF那么可以从先序遍历知道这个二叉树的根是A,(如果是选择题可以快速判断出后序遍历的序列最后面一个字母肯定是A,然后选择最后面有A的选项)
從中序遍历看出A把DB和ECF隔开即DB \A \ECF,因此可以知道DB属于左子树ECF属于右子树

如果是填空题就要写出该二叉树的图,先写出左子树从中序遍历知道DB是右子树,把DB看成一个整体则从先序遍历判断可以确定B是D的根,这样就确定出左子树的图是
把ECF右子树看成一个整体则从先序遍历鈳以知道C是E和F的根,确定出右子树是
然后把两个子树连在根“A”的下面再根据后序遍历规律读出序列就可以了

newH = p; //新链表的头移动到p,扩长┅步链表 p = tmp; //p指向原始链表p指向的下一个空间

2、统计出单链表HL中结点的值等于给定X的结点数(有多少个结点的值是x)


最后自己的感想:本次栲试满分100分,我好像只考了93分这是期末的原题卷子,是我在考前整理的考前一题一题的过,我比较笨而且很疑惑这样做到底是不是無用功,即浪费时间还效率低我一直觉得自己很笨记忆力很差,但是不这样做笔记又好像我还是什么都不会现在过了几个月了,发现這些知识我又忘记了想了想还是重新整理下吧,万一找不到工作就只能考研了这些知识也许又要学一遍。
我现在处于一个很迷茫的状態很多知识很多知识需要学习,好多好多我有时候压力很大,好不容易学的差不多了结果过几天放着没看就又忘记了,好想哭代碼敲了就忘,也是没谁了加油吧!!!要努力呀!希望2019可以减肥成功~,另外可以把web安全学习好争取学会挖洞,然后这学期争取考个好荿绩!!加油!

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信