数据结构复习资料(亲自整理)

合集下载

数据结构复习要点(整理版)

数据结构复习要点(整理版)

数据结构复习要点(整理版)数据结构复习要点(整理版)数据结构是计算机科学中非常重要的一门课程,它涉及到各种数据的存储和组织方式,对于编程和算法的理解都至关重要。

本文将整理常见的数据结构复习要点,帮助读者回顾和加深对数据结构的理解。

一、线性结构线性结构是最简单的数据结构之一,它包括线性表、栈、队列等。

线性表是具有相同数据类型的一组元素的有限序列,它可以分为顺序表和链表。

顺序表是一种用连续的存储单元依次存储线性表的元素的数据结构,而链表则是通过每个元素中存储下一个元素的地址来实现线性关系。

栈和队列是线性结构的特殊形式。

栈是一种先进后出(LIFO)的数据结构,它可以通过顺序栈或链栈来实现。

队列是一种先进先出(FIFO)的数据结构,它可以通过顺序队列或链队列来实现。

二、树形结构树形结构是一种非线性结构,它具有层次关系,由节点和边组成。

常见的树形结构包括二叉树、二叉搜索树、平衡二叉树和哈夫曼树。

二叉树是每个节点最多只有两个子节点的树,它可以是空树、只有一个根节点的树或者一个根节点连接两棵不相交的二叉树。

二叉搜索树是一种特殊的二叉树,它的左子树上所有节点的值小于根节点的值,右子树上所有节点的值大于根节点的值。

平衡二叉树是一种特殊的二叉搜索树,它的左子树和右子树的高度差不超过1,这样可以保证在最坏情况下的查找效率。

哈夫曼树是一种特殊的二叉树,它的叶子节点代表字符,而各节点的权值表示字符出现的频率,通过构造哈夫曼树可以实现数据的压缩编码。

三、图形结构图形结构是一种包含节点和边的非线性数据结构,它由顶点集合和边集合组成。

图形结构可以分为无向图和有向图,每个节点可以有一个或多个相邻节点。

图形结构的常见算法有深度优先搜索(DFS)和广度优先搜索(BFS)。

深度优先搜索是一种通过递归或栈实现的搜索算法,它先访问起始节点的一个邻接节点,再依次访问该节点的未被访问过的邻接节点,直到所有节点都被访问过。

广度优先搜索则是一种通过队列实现的搜索算法,它先访问起始节点的所有邻接节点,再依次访问这些邻接节点的邻接节点,以此类推,直到所有节点都被访问过。

数据结构复习资料复习提纲知识要点归纳

数据结构复习资料复习提纲知识要点归纳

数据结构复习资料复习提纲知识要点归纳数据结构复习资料:复习提纲知识要点归纳一、数据结构概述1. 数据结构的定义和作用2. 常见的数据结构类型3. 数据结构与算法的关系二、线性结构1. 数组的概念及其特点2. 链表的概念及其分类3. 栈的定义和基本操作4. 队列的定义和基本操作三、树结构1. 树的基本概念及定义2. 二叉树的性质和遍历方式3. 平衡二叉树的概念及应用4. 堆的定义和基本操作四、图结构1. 图的基本概念及表示方法2. 图的遍历算法:深度优先搜索和广度优先搜索3. 最短路径算法及其应用4. 最小生成树算法及其应用五、查找与排序1. 查找算法的分类及其特点2. 顺序查找和二分查找算法3. 哈希查找算法及其应用4. 常见的排序算法:冒泡排序、插入排序、选择排序、归并排序、快速排序六、高级数据结构1. 图的高级算法:拓扑排序和关键路径2. 并查集的定义和操作3. 线段树的概念及其应用4. Trie树的概念及其应用七、应用案例1. 使用数据结构解决实际问题的案例介绍2. 如何选择适合的数据结构和算法八、复杂度分析1. 时间复杂度和空间复杂度的定义2. 如何进行复杂度分析3. 常见算法的复杂度比较九、常见问题及解决方法1. 数据结构相关的常见问题解答2. 如何优化算法的性能十、总结与展望1. 数据结构学习的重要性和难点2. 对未来数据结构的发展趋势的展望以上是数据结构复习资料的复习提纲知识要点归纳。

希望能够帮助你进行复习和回顾,加深对数据结构的理解和掌握。

在学习过程中,要注重理论与实践相结合,多进行编程练习和实际应用,提高数据结构的实际运用能力。

祝你复习顺利,取得好成绩!。

数据结构(复习提纲)【整理】

数据结构(复习提纲)【整理】

2010年复习提纲第一章数据、数据结构的概念;基本逻辑结构的种类;集合线性树形图状基本存储方式的种类;顺序链式散列索引算法、算法的时间复杂度以及其计算。

算法的五大特性:输入输出确定性有穷性有效性时间复杂度的计算:忽略常数与中间变量,循环套循环用乘法第二章线性表的概念;顺序存储和链接存储的线性表的数据结构、特性;顺序存储的特性:查找方便,不易扩充链接存储的特性:插入删除方便顺序存储和链接存储的线性表的基本算法:创建、插入、查找、删除等;链表的其他形式(带表头、循环、双向、双向循环等)的概念及基本算法(与一般链表的不同处)。

带表头:便于其后结点执行标准化操作循环:首尾相接双向:既可以查找前继又可以查找后继双向循环:结合以上两点链表逆转;第二章相关算法列举如下1.。

顺序线性表的插入Int sq_insert(int list[],int *p_n,int i,int x) { Int j;If(i<0||i>*p_n) return(1);If(*p_n==MAXSIZE) return(2);For(j=*p_n;j>I;j--)List[j]=list[j-1];List[i]=x;(*p_n)++;Return(0);} 2.顺序线性表的删除Int sq_delete(int list[],int *p_n,int i) {Int j;If(i<0||i>=*p_n) return(1);For(j=i+1;j<*p_n;j++)List[j-1]=list[j];(*p_n)--;Return(0);}3.链式线性表的创建NODE *create_link_list(int n){ int i;NODE *p,*q;NODE *p_head;if(n==0) return(NULL);p_head=new(NODE);p_head->data=-1;p=p_head;for(i=1;i<=n;i++){printf("请输入第%d个节点的值\n",i);q=new(NODE);scanf("%d",&(q->data));p->link=q;p=q;}q->link=NULL;return(p_head);/*返回的是假头*/ ※4.链式线性表的插入(i之后)Int insert(NODE* *p_head,int i,int a) { int n=0;NODE *p,*q,*r;p=*p_head;if(i<1) return(0);while((p!=NULL)&&(n<i)){If(p->data!=-1) n++;q=p;p=p->link;}r=new(NODE);r->data=a;r->link=q->link;q->link=r;}※5.链式线性表的删除int del(NODE* *p_head,int I) { NODE *p,*q;int n=0;p=*p_head;if(i<1) return(0);while((p!=NULL)&&(n<i)){If(p->data!=-1) n++;q=p;p=p->link;}if(p==NULL) return(0);q->link=p->link;delete(p);return(1);} 6.单链表的逆置NODE * reverse(NODE *head) {NODE *p,*q;P=head->next;Head->next=NULL;While(p){Q=p->next;p->next=head->next;head->next=p;p=q;}return(head);}7.试写一高效的算法,删除表中所有大于mink且小于maxk的元素Void Delete_between(int a[],int mink,int maxk){p=L;while(p->next->data<=mink) p=p->next;(本循环结束时p是最后一个不大于mink的元素)if(p->next)(如果还有比mink更大的元素){q=p->next;while(q->data<maxk) q=q->next;(本循环结束时q 是第一个不小于maxk 的元素)p->next=q;}}第三章栈与队列的概念;栈:只允许在一端进行插入和删除的线性表队列:只允许在一端进行插入,且只允许在另一端进行删除的线性表顺序栈和链栈的数据结构与基本算法;顺序队列(尤其是循环队列)和链队列的数据结构与基本算法;栈的应用算法;如何判断顺序栈的空与满、如何判断循环队列的空与满;判断顺序栈的空与满:若top的初始值是-1 则判空条件是if(top==-1) 判满条件是if(top==MAXN)若top的初始值是0 则判空条件是if(top==0) 判满条件是if(top==MAXN-1)判断循环队列的空与满{Head=0,tail=0;判断循环队列的空与满的条件都是if(head==tail)}中缀表达式与后缀表达式规则以及两者间的转换。

数据结构复习资料

数据结构复习资料

数据结构复习资料数据结构复习资料数据结构是计算机科学中非常重要的一个领域,它研究的是数据的组织、存储和管理方式。

掌握数据结构的基本概念和常用算法,对于提高程序的效率和性能至关重要。

在这篇文章中,我将为大家提供一些数据结构的复习资料,希望对大家的学习有所帮助。

一、线性结构1. 数组(Array)数组是一种最基本的数据结构,它将一组相同类型的数据元素按照一定顺序存储在连续的内存空间中。

复习数组时,需要掌握数组的定义、初始化、访问和操作等基本操作。

2. 链表(Linked List)链表是一种常见的动态数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

复习链表时,需要了解单链表、双链表和循环链表的定义、插入、删除和遍历等操作。

3. 栈(Stack)栈是一种具有后进先出(LIFO)特性的数据结构,它只允许在栈顶进行插入和删除操作。

复习栈时,需要了解栈的定义、初始化、入栈、出栈和判空等基本操作。

4. 队列(Queue)队列是一种具有先进先出(FIFO)特性的数据结构,它只允许在队尾插入元素,在队头删除元素。

复习队列时,需要了解队列的定义、初始化、入队、出队和判空等基本操作。

二、非线性结构1. 树(Tree)树是一种具有分层结构的数据结构,它由一组节点组成,每个节点可以有零个或多个子节点。

复习树时,需要了解二叉树、平衡二叉树和二叉搜索树的定义、插入、删除和遍历等操作。

2. 图(Graph)图是一种由节点和边组成的数据结构,它用于表示多对多的关系。

复习图时,需要了解图的定义、遍历、最短路径和最小生成树等算法。

三、排序算法排序算法是数据结构中非常重要的一部分,它用于将一组无序的数据按照一定的规则进行排列。

复习排序算法时,需要了解冒泡排序、插入排序、选择排序、快速排序、归并排序和堆排序等常见的排序算法,以及它们的时间复杂度和空间复杂度。

四、查找算法查找算法是数据结构中用于在一组数据中查找特定元素的算法。

数据结构知识点整理

数据结构知识点整理

数据结构知识点整理第一点:数据结构的基本概念与类型数据结构是计算机科学中的一个重要分支,它研究的是如何有效地存储、组织和管理数据,以便于计算机可以高效地进行数据的读取、插入、删除等操作。

数据结构的基本概念主要包括两个方面:数据的逻辑结构与数据的物理结构。

1.1 数据的逻辑结构数据的逻辑结构主要描述数据的逻辑关系,不涉及数据的存储方式。

常见的逻辑结构有:•线性结构:如线性表、栈、队列、串等。

线性结构的特点是数据元素之间存在一对一的关系,每个数据元素只有一个直接前驱和一个直接后继。

•非线性结构:如树、图等。

非线性结构的特点是数据元素之间存在一对多或者多对多的关系。

其中,树结构是一种重要的非线性结构,它具有层次性,每个数据元素(树节点)有零个或多个子节点。

1.2 数据的物理结构数据的物理结构主要描述数据在计算机内存中的存储方式,它直接影响了计算机对数据的访问效率。

常见的物理结构有:•顺序存储结构:如数组、链表等。

顺序存储结构将数据元素按照一定的顺序存放在计算机内存中,相邻的数据元素在内存中也是相邻的。

•链式存储结构:如单链表、双向链表、循环链表等。

链式存储结构通过指针将不连续的数据元素连接起来,每个数据元素只存储数据本身以及指向下一个数据元素的指针。

1.3 数据结构的应用场景不同的数据结构适用于不同的应用场景。

例如:•线性表:适用于顺序访问数据元素的场景,如学生成绩管理系统。

•栈和队列:适用于后进先出(LIFO)或先进先出(FIFO)的场景,如表达式求值、任务调度等。

•树结构:适用于具有层次关系的数据组织,如文件系统的目录结构、HTML文档的DOM树等。

•图结构:适用于表示复杂的关系,如社交网络、交通网络等。

第二点:常见数据结构算法与应用在计算机科学中,算法是解决问题的一系列清晰指令。

结合数据结构,算法可以有效地解决实际问题。

以下是一些常见的数据结构及其相关算法与应用。

2.1 线性表的算法与应用线性表是最基本的逻辑结构。

数据结构复习要点(整理版)

数据结构复习要点(整理版)

第一章数据结构概述基本概念与术语1.数据:数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序所处理的符号的总称。

2.数据元素:数据元素是数据的基本单位,是数据这个集合中的个体,也称之为元素,结点,顶点记录。

(补充:一个数据元素可由若干个数据项组成。

数据项是数据的不可分割的最小单位。

)3.数据对象:数据对象是具有相同性质的数据元素的集合,是数据的一个子集。

(有时候也叫做属性。

)4.数据结构:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

(1)数据的逻辑结构:数据的逻辑结构是指数据元素之间存在的固有逻辑关系,常称为数据结构。

数据的逻辑结构是从数据元素之间存在的逻辑关系上描述数据与数据的存储无关,是独立于计算机的。

依据数据元素之间的关系,可以把数据的逻辑结构分成以下几种:1.集合:数据中的数据元素之间除了“同属于一个集合“的关系以外,没有其他关系。

2.线性结构:结构中的数据元素之间存在“一对一“的关系。

若结构为非空集合,则除了第一个元素之外,和最后一个元素之外,其他每个元素都只有一个直接前驱和一个直接后继。

3.树形结构:结构中的数据元素之间存在“一对多“的关系。

若数据为非空集,则除了第一个元素(根)之外,其它每个数据元素都只有一个直接前驱,以及多个或零个直接后继。

4.图状结构:结构中的数据元素存在“多对多”的关系。

若结构为非空集,折每个数据可有多个(或零个)直接后继。

(2)数据的存储结构:数据元素及其关系在计算机内的表示称为数据的存储结构。

想要计算机处理数据,就必须把数据的逻辑结构映射为数据的存储结构。

逻辑结构可以映射为以下两种存储结构:1.顺序存储结构:把逻辑上相邻的数据元素存储在物理位置也相邻的存储单元中,借助元素在存储器中的相对位置来表示数据之间的逻辑关系。

2.链式存储结构:借助指针表达数据元素之间的逻辑关系。

不要求逻辑上相邻的数据元素物理位置上也相邻。

数据结构复习资料

数据结构复习资料

数据结构复习资料一、数据结构的基本概念数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

它不仅要考虑数据元素的存储,还要关注数据元素之间的关系以及对这些数据的操作。

数据元素是数据的基本单位,例如整数、字符、字符串等。

而数据项则是数据元素的最小不可分割的部分。

常见的数据结构类型包括线性结构(如数组、链表、栈和队列)、树形结构(如二叉树、二叉搜索树、AVL 树等)、图形结构等。

二、线性结构1、数组数组是一组具有相同数据类型的元素的有序集合。

它的优点是可以通过下标快速访问元素,但插入和删除操作可能比较低效,因为需要移动大量元素。

2、链表链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

链表的插入和删除操作相对简单,但访问特定元素需要遍历链表。

3、栈栈是一种特殊的线性表,遵循后进先出(LIFO)原则。

入栈和出栈操作是栈的基本操作。

4、队列队列遵循先进先出(FIFO)原则,入队和出队操作是队列的主要操作。

三、树形结构1、二叉树二叉树是每个节点最多有两个子节点的树形结构。

它有满二叉树、完全二叉树等特殊形式。

2、二叉搜索树二叉搜索树的左子树的所有节点值小于根节点值,右子树的所有节点值大于根节点值。

这使得查找、插入和删除操作的平均时间复杂度为 O(log n)。

3、 AVL 树AVL 树是一种自平衡的二叉搜索树,通过旋转操作保持树的平衡,从而保证查找、插入和删除的时间复杂度始终为 O(log n)。

四、图形结构图形由顶点和边组成,可以分为有向图和无向图。

常见的算法包括深度优先搜索和广度优先搜索,用于遍历图形。

五、数据结构的操作对于不同的数据结构,常见的操作包括创建、插入、删除、查找、遍历等。

1、插入操作根据数据结构的特点,选择合适的位置插入新元素。

2、删除操作准确找到要删除的元素,并处理删除后的结构调整。

3、查找操作利用数据结构的特性,提高查找效率。

4、遍历操作如前序遍历、中序遍历、后序遍历对于二叉树;深度优先遍历和广度优先遍历对于图形。

数据结构复习提纲(整理)

数据结构复习提纲(整理)

复习提纲第一章数据结构概述基本概念与术语(P3)1.数据结构是一门研究非数值计算程序设计问题中计算机的操作对象以及他们之间的关系和操作的学科.2.数据是用来描述现实世界的数字,字符,图像,声音,以及能够输入到计算机中并能被计算机识别的符号的集合2.数据元素是数据的基本单位3.数据对象相同性质的数据元素的集合4.数据结构包括三方面内容:数据的逻辑结构.数据的存储结构.数据的操作. (1)数据的逻辑结构指数据元素之间固有的逻辑关系.(2)数据的存储结构指数据元素及其关系在计算机内的表示( 3 ) 数据的操作指在数据逻辑结构上定义的操作算法,如插入,删除等.5.时间复杂度分析--------------------------------------------------------------------------------------------------------------------1、名词解释:数据结构、二元组2、根据数据元素之间关系的不同,数据的逻辑结构可以分为集合、线性结构、树形结构和图状结构四种类型。

3、常见的数据存储结构一般有四种类型,它们分别是___顺序存储结构_____、___链式存储结构_____、___索引存储结构_____和___散列存储结构_____。

4、以下程序段的时间复杂度为___O(N2)_____。

int i,j,x;for(i=0;i<n:i++) n+1for(j=0;j<n;j++) n+1x+=i;------------------------------------------------------------------------------------------------------------------第二章线性表1.顺序表结构由n(n>=0)个具有相同性质的数据元素a1,a2,a3……,an组成的有穷序列//顺序表结构#define MAXSIZE 100typedef int DataType;Typedef struct{DataType items[MAXSIZE];Int length;}Sqlist,*LinkList;//初始化链表void InitList(LinkList *L){(*L)=(LinkList)malloc(sizeof(LNode));if(!L){cout<<”初始化失败!”;return;}(*L)->next=NULL;}//插入数据void InsertList(LinkList L,int pos,DataType x){LinkList p=L,q;int i=0;while(p&&i<pos-1){p=p->next;i++;}if(!p||i>pos-1){cout<<”插入位置错误”;return;}InitList(&q);q->next=p->next;p->next=q;q->data=x;}//销毁链表void DestoryList(LinkList L){LinkList t;while(L){t=L;L=L->next;free(t);}}//遍历链表void TraverseList(LinkList L){LinkList t=L;while(L){t=t->next;cout<<t->data<<” ”;}cout<<endl;}//删除元素void DeleteList(LinkList L,int pos){LinkList p=L,q;int i=0;while(p&&i<pos-1){p=p->next;i++;}if(!p||i>pos-1){cout<<”删除位置错误!!”;return;}q=p->next;p->next=q->next;free(q):}第三章栈和队列1.栈(1)栈的结构与定义(2)顺序栈操作算法:入栈、出栈、判断栈空等(3)链栈的结构与定义2.队列(1)队列的定义----------------------------------------------------------------------------------------------------------------1、一个栈的入栈序列为“ABCDE”,则以下不可能的出栈序列是()A. BCDAEB. EDACBC. BCADED. AEDCB2、栈的顺序表示仲,用TOP表示栈顶元素,那么栈空的条件是()A. TOP==STACKSIZEB. TOP==1C. TOP==0D. TOP==-13、允许在一端插入,在另一端删除的线性表称为____队列____。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、简答题1、链表:链表就是一串存储数据的链式结构。

链式的优点在于,每个数据之间都是相关联的。

2、线性结构:线性结构是一个有序数据元素的集合。

常用的线性结构有:线性表,栈,队列,双队列,数组,串。

3、树与二叉树二叉树是每个结点最多有两个子树的有序树;树是由n(n>=1)个有限节点组成一个具有层次关系的集合。

树和二叉树的2个主要差别:1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;2. 树的结点无左、右之分,而二叉树的结点有左、右之分。

4、堆堆通常是一个可以被看做一棵树的数组对象。

堆总是满足下列性质:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。

5、二叉排序树二叉排序数的(递归)定义:1、若左子树非空,则左子树所有节点的值均小于它的根节点;2、若右子树非空,则右子树所有节点的值均大于于它的根节点;3、左右子树也分别为二叉排序树。

二、应用题1、树与二叉树①前中后序遍历序列一、已知前序、中序遍历,求后序遍历例:前序遍历: GDAFEMHZ中序遍历: ADEFGHMZ画树求法:第一步,根据前序遍历的特点,我们知道根结点为G第二步,观察中序遍历ADEFGHMZ。

其中root节点G左侧的ADEF必然是root的左子树,G右侧的HMZ必然是root的右子树。

第三步,观察左子树ADEF,左子树的中的根节点必然是大树的root的leftchild。

在前序遍历中,大树的root的leftchild位于root之后,所以左子树的根节点为D。

第四步,同样的道理,root的右子树节点HMZ中的根节点也可以通过前序遍历求得。

在前序遍历中,一定是先把root和root的所有左子树节点遍历完之后才会遍历右子树,并且遍历的左子树的第一个节点就是左子树的根节点。

同理,遍历的右子树的第一个节点就是右子树的根节点。

②树与二叉树的转换树转换为二叉树:二叉树转换为树:③二叉树线索化注意:图中的实线表示指针,虚线表示线索。

结点C的左线索为空,表示C是中序序列的开始结点,无前趋;结点E的右线索为空,表示E是中序序列的终端结点,无后继。

线索二叉树中,一个结点是叶结点的充要条件为:左、右标志均是1。

2、图①邻接表一、邻接表二、无向图的邻接表3、4、图7-5三、有向图的邻接表和逆邻接表(一)在有向图的邻接表中,第i个单链表链接的边都是顶点i发出的边。

(二)为了求第i个顶点的入度,需要遍历整个邻接表。

因此可以建立逆邻接表。

(三)在有向图的逆邻接表中,第i个单链表链接的边都是进入顶点i的边。

四、邻接表小结◆设图中有n个顶点,e条边,则用邻接表表示无向图时,需要n个顶点结点,2e个表结点;用邻接表表示有向图时,若不考虑逆邻接表,只需n个顶点结点,e个边结点。

◆在无向图的邻接表中,顶点v i的度恰为第i个链表中的结点数。

◆在有向图中,第i个链表中的结点个数只是顶点v i的出度。

在逆邻接表中的第i个链表中的结点个数为v i的入度。

②邻接矩阵(有向、无向)1.图的邻接矩阵表示法在图的邻接矩阵表示法中:①用邻接矩阵表示顶点间的相邻关系②用一个顺序表来存储顶点信息2.图的邻接矩阵(Adacency Matrix)设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下性质的n阶方阵:【例】下图中无向图G 5 和有向图G 6 的邻接矩阵分别为A l 和A 2 。

③广度优先遍历广度优先遍历是连通图的一种遍历策略。

其基本思想如下:1、从图中某个顶点V0出发,并访问此顶点;2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;3、重复步骤2,直到全部顶点都被访问为止。

例如下图中:1.从0开始,首先找到0的关联顶点3,42.由3出发,找到1,2;由4出发,找到1,但是1已经遍历过,所以忽略。

3.由1出发,没有关联顶点;由2出发,没有关联顶点。

所以最后顺序是0,3,4,1,2④深度优先遍历深度优先遍历是连通图的一种遍历策略。

其基本思想如下:设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y)。

若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。

上述过程直至从x出发的所有边都已检测过为止。

例如下图中:1.从0开始,首先找到0的关联顶点32.由3出发,找到1;由1出发,没有关联的顶点。

3.回到3,从3出发,找到2;由2出发,没有关联的顶点。

4.回到4,出4出发,找到1,因为1已经被访问过了,所以不访问。

所以最后顺序是0,3,1,2,4⑤Prim算法基本思想:假设G=(V,E)是连通的,TE是G上最小生成树中边的集合。

算法从U={u0}(u0∈V)、TE={}开始。

重复执行下列操作:在所有u∈U,v∈V-U的边(u,v)∈E中找一条权值最小的边(u0,v0)并入集合TE中,同时v0并入U,直到V=U为止。

此时,TE中必有n-1条边,T=(V,TE)为G的最小生成树。

Prim算法的核心:始终保持TE中的边集构成一棵生成树。

注意:prim算法适合稠密图,其时间复杂度为O(n^2),其时间复杂度与边得数目无关,而kruskal算法的时间复杂度为O(eloge)跟边的数目有关,适合稀疏图。

⑥Krusal算法图中先将每个顶点看作独立的子图,然后查找最小权值边,这条边是有限制条件的,边得两个顶点必须不在同一个图中,如上图,第一个图中找到最小权值边为(v1,v3),且满足限制条件,继续查找到边(v4,v6),(v2,v5),(v3,v6),当查找到最后一条边时,仅仅只有(v2,v3)满足限制条件,其他的如(v3,v4),(v1,v4)都在一个子图里面,不满足条件,至此已经找到最小生成树的所有边。

⑦拓扑排序由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

对上图进行拓扑排序的结果:2->8->0->3->7->1->5->6->9->4->11->10->125、检索①二叉排序建立typedef struct node{int data;struct node * lchild;struct node * rchild;}node;void Init(node *t){t = NULL;}void InOrder(node * t) //中序遍历输出{if(t != NULL){InOrder(t->lchild);printf("%d ", t->data);InOrder(t->rchild);}}②二叉排序删除btree * DelNode(btree *p){if (p->lchild){btree *r = p->lchild; //r指向其左子树;btree *prer = p->lchild; //prer指向其左子树;while(r->rchild != NULL)//搜索左子树的最右边的叶子结点r{prer = r;r = r->rchild;}p->data = r->data;if(prer != r)//若r不是p的左孩子,把r的左孩子作为r的父亲的右孩子prer->rchild = r->lchild;elsep->lchild = r->lchild; //否则结点p的左子树指向r的左子树free(r);return p;}else{btree *q = p->rchild; //q指向其右子树;free(p);return q;}}③Huffman树、编码与解码例. 给定有18个字符组成的文本:A A D A T A R A E F R T A A F T E R 求各字符的哈夫曼码。

(1)统计:(2)构造Huffman树:(3) 在左分枝标0,右分枝标1:(4) 确定Huffman 编码:(5)译码:例. 给定代码序列:0 0 1 0 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1 10文本为:A A F A R A D E T④散列存储6、内排序①希尔排序void ShellPass(SeqList R,int d){//希尔排序中的一趟排序,d为当前增量for(i=d+1;i<=n;i++) //将R[d+1..n]分别插入各组当前的有序区if(R[i].key<R[i-d].key){R[0]=R[i];j=i-d;//R[0]只是暂存单元,不是哨兵do {//查找R[i]的插入位置R[j+d];=R[j];//后移记录j=j-d;//查找前一记录}while(j>0&&R[0].key<R[j].key);R[j+d]=R[0];//插入R[i]到正确的位置上} //endif} //ShellPassvoid ShellSort(SeqList R){int increment=n;//增量初值,不妨设n>0do {increment=increment/3+1;//求下一增量ShellPass(R,increment);//一趟增量为increment的Shell插入排序}while(increment>1)} //ShellSort②直接插入排序void lnsertSort(SeqList R){ //对顺序表R中的记录R[1..n]按递增序进行插入排序int i,j;for(i=2;i<=n;i++) //依次插入R[2],…,R[n]if(R[i].key<R[i-1].key){//若R[i].key大于等于有序区中所有的keys,则R[i]//应在原有位置上R[0]=R[i];j=i-1; //R[0]是哨兵,且是R[i]的副本do{ //从右向左在有序区R[1..i-1]中查找R[i]的插入位置R[j+1]=R[j];//将关键字大于R[i].key的记录后移j--;}while(R[0].key<R[j].key);//当R[i].key≥R[j].key时终止R[j+1]=R[0];//R[i]插入到正确的位置上}//endif}//InsertSort③选择排序void SelectSort(SeqList R){int i,j,k;for(i=1;i<n;i++){//做第i趟排序(1≤i≤n-1)k=i;for(j=i+1;j<=n;j++) //在当前无序区R[i..n]中选key最小的记录R[k]if(R[j].key<R[k].key)k=j; //k记下目前找到的最小关键字所在的位置if(k!=i){ //交换R[i]和R[k]R[0]=R[i];R[i]=R[k];R[k]=R[0];//R[0]作暂存单元} //endif} //endfor} //SeleetSort④交换排序void BubbleSort(SeqList R){ //R(l..n)是待排序的文件,采用自下向上扫描,对R做冒泡排序int i,j;Boolean exchange;//交换标志for(i=1;i<n;i++){ //最多做n-1趟排序exchange=FALSE;//本趟排序开始前,交换标志应为假for(j=n-1;j>=i;j--) //对当前无序区R[i..n]自下向上扫描if(R[j+1].key<R[j].key){//交换记录R[0]=R[j+1];//R[0]不是哨兵,仅做暂存单元R[j+1]=R[j];R[j]=R[0];exchange=TRUE;//发生了交换,故将交换标志置为真}if(!exchange) //本趟排序未发生交换,提前终止算法return;} //endfor(外循环)} //BubbleSortvoid QuickSort(SeqList R,int low,int high){ //对R[low..high]快速排序int pivotpos;//划分后的基准记录的位置if(low<high){//仅当区间长度大于1时才须排序pivotpos=Partition(R,low,high);//对R[low..high]做划分QuickSort(R,low,pivotpos-1);//对左区间递归排序QuickSort(R,pivotpos+1,high);//对右区间递归排序}} //QuickSort⑤归并排序void Merge(SeqList R,int low,int m,int high){//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的//子文件R[low..high]int i=low,j=m+1,p=0;//置初始值RecType *R1;//R1是局部向量,若p定义为此类型指针速度更快R1=(ReeType *)malloc((high-low+1)*sizeof(RecType));if(! R1) //申请空间失败Error("Insufficient memory available!");while(i<=m&&j<=high) //两子文件非空时取其小者输出到R1[p]上R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++];while(i<=m) //若第1个子文件非空,则复制剩余记录到R1中R1[p++]=R[i++];while(j<=high) //若第2个子文件非空,则复制剩余记录到R1中R1[p++]=R[j++];for(p=0,i=low;i<=high;p++,i++)R[i]=R1[p];//归并完成后将结果复制回R[low..high]} //Merge三、选择题1、二叉树的第i层至多有2^(i −1)个结点;深度为k的二叉树至多有2^k −1个结点(根结点的深度为1)2、二维数组A[10...20,5....10]采用行序为主存方式存储,每个元素占4个存储单元,且A[10,5]的存储地址为1000,则A[18,9]的存储地址?a.不管按行还是按列,都是顺序存储。

相关文档
最新文档