当前位置:文档之家› 湖南大学数据结构BST的实现和插入

湖南大学数据结构BST的实现和插入

湖南大学数据结构BST的实现和插入
湖南大学数据结构BST的实现和插入

HUNAN UNIVERSITY 课程实习报告

题目: BST的实现和插入

学生姓名

学生学号

专业班级

指导老师李晓鸿

完成日期

问题描述

利用二叉查找树(BST)实现一个动态查找表。

基本要求

(1)使用二叉树(BST)来实现。

(2)二叉树使用链式结构(二叉链表)实现。

(3)实现BST的构建,查找两个功能。

实现提示

输入:

8//BST的节点个数

34, 76, 45, 18, 26, 54, 92, 65 //8个数据

45//查找 45

输出:查找成功 3 //返回成功和查找时比较的次数

34//查找 34

输出:查找成功 1 //返回成功和查找时比较的次数

100//查找 100

输出:查找不成功 3 //返回成功和查找时比较的次数

一、需求分析

二叉排序树又称二叉查找树

其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:

①若它的左子树非空,则左子树上所有结点的值均小于根结点的值;

②若它的右子树非空,则右子树上所有结点的值均大于根结点的值;

③左、右子树本身又各是一棵二叉排序树。

上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。

1.输入的形式和输入值的范围:初始化时需要输入初始化时输入的数据个数,以及这一组需要输入的数据。由于BST的性质,数据为关键码(即可以比较大小),为简单起见,均设为整数类型,查找时需要输入被查找的数据对象,也为整数类型

2.输出的形式:查找时如果在存储的数据中查找到被查找的数据,需要显示查找成功,并显示查找时比较的次数,如果查找不成功,也需要显示查找不成功,并输出查找时比较的次数。

3.功能:建立存储数据的结构,初始化时将输入的数据存储,在查找时能够在存储的数据中进行搜索以寻找被查找的数据,并进行相关显示。并且对于输入的不符合规范的数据个数与被查找数据要求能报错。

4.测试数据

输入:

8//BST的节点个数

34, 76, 45, 18, 26, 54, 92, 65 //8个数据

45//查找45

输出:查找成功,查找了3次//返回成功和查找时比较的次数

34//查找34

输出:查找成功,查找了1次//返回成功和查找时比较的次数

100//查找100

输出:查找不成功查找了3次//返回成功和查找时比较的次数

二、概要设计

1.抽象数据类型

由于BST的特殊性,需要比大小,于是需要关键码,这里选取整数作为关键码(1)ADT BinNode

数据对象:D={ai|ai

数据关系:R1={|ai-1,ai

基本操作:int val() //返回结点的数值

Void setVal(const Elem&)//设置节点的值

inline BinNode* left()const //获取左结点

inline BinNode* right()const //获取右结点

void setLeft(Node* it) //设置左结点

void setRight(Node* it) //设置右结点

Bool isLeaf()//是叶子节点吗

(2)ADT BST

数据对象BinNode

数据关系二叉查找树

基本操作searchTree(Node* subroot,int data)//执行查找基本操作的函数需要一个数据作为被查找的数据,查找成功,或失败进行相关显示,输出比较次数。

creatTree(Node** subroot,int data)//执行插入的基本操作的函数需要一个数

据作为输入的值,一个数据为将要被处理的树,其将输入的值放在树中合

适的位置。

2.算法的基本思想

(1)建树

<1>建立空树;

<2>取数值建立新节点;

<3>新节点内的数值与树根节点比值,若根节点为空,新节点为根节点(利用插入操作)。若新节点内数值比根节点数值大,新节点进去根节点右子树,重复<3>,若新节点内数值比根节点数值小,新节点进去根节点左子树,重复<3>,直到无新节点建立;

利用遍历与BST特性完成查找:

(2)查找

<1>要查询的数值与根节点比值,若要查询的数值比根节点数值大,新节点进去根节点右子树,重复<1>,若要查询的数值比根节点数值小,新节点进去根节点左子树,重复<1>,直到找到这个数,或者比较到了叶子节点。

(3)主函数

<1>创建一个结点的类

<2>提示用户输入数据的个数M,此处进行异常处理,若M小于0,则报错。

<3>循环输入数据,调用插入函数创建BST,若输入的不为整数,则重新输入,直到输入成功的个数与M相等为止。

<4>输入查找的数据,查找成功或不成功,都进行相关的显示,并输入查找的次数

3.程序的流程

程序由三个模块组成:

(1) 初始化模块:完成输入初始化BST所需的节点个数与节点内存储的值,建立

BST。

(2)查找模块:实现在BST内查找元素值的功能。

(3) 输出模块:输出每次查找的结果和比较的次数。

三、详细设计

1.物理数据类型

(1)叶子节点的基本操作

BST() { root = NULL; nodecount = 0; }//建立空树

~BST() { clearhelp(root); }

void clear() { clearhelp(root); root = NULL;nodecount = 0; }

bool insert(const Elem& e) //插入

{

root = inserthelp(root, e);//inserthelp具体实现

nodecount++;

return true; }

bool find(const Key& K, Elem& e,int& c) const //查找

{ return findhelp(root, K, e,c); }//findhelp具体实

(2)树的操作

bool searchTree(Node* subroot,int data) //在结点subroot中查找数据data ,二叉查找树

{

if(subroot!=NULL)//如果指针不指向空

{

i++;//记住,每次调用函数时i 初始为0

if(datadata)

return searchTree(subroot->pLeftChild,data);//当data比结点中的值小,访问结点左子树

else

{

if(data>subroot->data)

return searchTree(subroot->pRightChild,data);//当data比结点中的值大,访问结点右子树

else

{

if(data==subroot->data)

{

cout<<"查找成功 ";

cout<<"查找了"<

}

return true;

}//若相等,查找成功,进行相关输出等

}

}

else

{

cout<<"查找不成功 ";

cout<<"查找了"<

return false;

} //若指针指向空,知未查找到,进行相关输出

}

bool creatTree(Node** subroot,int data)

{

if(*subroot!=NULL)//指针所指不为空

{

if(data<(*subroot)->data)

creatTree(&((*subroot)->pLeftChild),data);//当data比结点中的值小,访问结点左子树

else

{

if(data>(*subroot)->data)

creatTree(&((*subroot)->pRightChild),data);//当data比结点中的值大,访问结点右子树

}

}

else

{

*subroot=new Node;

(*subroot)->data=data;

}//若指针指向空,新建结点,将data的值放入

return true;

}

2.算法的时空分析

(1)关于空间开销,由于我们的二叉查找树为指针型的,空间开销正比于结点个数,即设每个结点中数据的空间开销为a,每个指针的空间开销为b,则树的空间(M个结点)开销θ(M*(a+2*b))

(2)关于时间开销,新建树时的时间开销与插入的数据在原有树的结点的数据的值中的大小关系有关,与原有树的层数有关,无法精确分析,设某时刻的树的层数为n,则最小时间开销为常数,最大时间开销为θn,查找时的时间开销也如此

3..

函数的调用关系图

主程序

4.输入和输出的格式

输入

1.建树: 请输入请输入数据个数 ://提示输入

等待输入

请输入数据: //提示输入

2.查找: 请输入欲查找的数: //提示输入

等待输入

输出

1.成功:查找成功 ,查找了i 次“ //i 为查找的次数

2.失败:查找不成功 ,查找了i 次“ //i 为查找的次数

四、用户使用说明(可选)

1、本程序的运行环境为DOS 操作系统,执行文件为conversion.exe

2、运行程序时

输入

1.建树: 请输入请输入数据个数 ://提示输入 等待输入

请输入数据: //提示输入

2.查找: 请输入欲查找的数: //提示输入

等待输入

输出

提示用户输入节点的个数和数值

1.成功:查找成功,查找了i次“ //i为查找的次数

2.失败:查找不成功,查找了i次“ //i为查找的次数

(完整word版)数据结构课后习题及答案

填空题(10 * 1 '= 10') 一、概念题 22当对一个线性表经常进行的是插入和删除操作时,采用链式存储结构为宜。 23当对一个线性表经常进行的是存取操作,而很少进行插入和删除操作时,最好采用顺序存储结构。 2.6. 带头结点的单链表L中只有一个元素结点的条件是L->Next->Next==Null。 36循环队列的引入,目的是为了克服假溢出。 4.2. 长度为0的字符串称为空串。 4.5. 组成串的数据元素只能是字符。 4.8. 设T和P是两个给定的串,在T中寻找等于P的子串的过程称为模式匹配,又称P为模式。 7.2. 为了实现图的广度优先搜索,除一个标志数组标志已访问的图的结点外,还需要队列存放被访问的结点实现遍历。 5.7. 广义表的深度是广义表中括号的重数 7.8. 有向图G可拓扑排序的判别条件是有无回路。 7.9. 若要求一个稠密图的最小生成树,最好用Prim算法求解。 8.8. 直接定址法法构造的哈希函数肯定不会发生冲突。 9.2. 排序算法所花费的时间,通常用在数据的比较和交换两大操作。 1.1. 通常从正确性、可读性、健壮性、时空效率等几个方面评价算法的(包括程序)的质量。 1.2. 对于给定的n元素,可以构造出的逻辑结构有集合关系、线性关系树形关系、图状关系四种。 1.3. 存储结构主要有顺序存储、链式存储、索引存储、散列存储四种。 1.4. 抽象数据类型的定义仅取决于它的一组逻辑特性,而与存储结构无关,即不论其内部结构如何变化,只要它的数学特性不 变,都不影响其外部使用。 1.5. 一个算法具有五大特性:有穷性、确定性、可行性,有零个或多个输入、有一个或多个输入。 2.8. 在双向链表结构中,若要求在p指针所指的结点之前插入指针为s所指的结点,则需执行下列语句: s_>prior= p_>prior; s->next= p; p_>prior- next= s; p_>prior= s;。 2.9. 在单链表中设置头结点的作用是不管单链表是否为空表,头结点的指针均不空,并使得对单链表的操作 (如插入和删除)在各种情况下统一。 3.1. 队列是限制在表的一端进行插入和在另一端进行删除的线性表,其运算遵循先进先出原则。 3.2 .栈是限定尽在表位进行插入或删除操作的线性表。 3.5. 在链式队列中,判定只有一个结点的条件是(Q->rear==Q->fro nt)&&(Q->rear!=NULL) 。 3.7. 已知链队列的头尾指针分别是f和r,则将x入队的操作序列是node *p=(node *)malloc(node); p->next=x;] p_>next=NULL; if(r) {r->next=p; r=p;} else {r=p; f=p;}。 3.8. 循环队列的满与空的条件是(rear+1)%MAXSIZE==fornt 和(fron t=-1 &&rear+ ^=MAXSIZE) 。 4.3. 串是一种特殊的线性表,其特殊性表现在数据元素都是由字符组成。 4.7. 字符串存储密度是串值所占存储位和实际分配位的比值,在字符串的链式存储结构中其结点大小是可变的。 5.3. 所谓稀疏矩阵指的是矩阵中非零元素远远小于元素总数,则称该矩阵为矩阵中非零元素远远小于元素总数,则称该矩阵为稀 疏矩阵。 5.4. —维数组的逻辑结构是线性结构,存储结构是顺序存储结构;对二维或多维数组,分别按行优先和列优先两种?不同的存储 方式。 7.4. 在有向图的邻接矩阵表示中,计算第i个顶点入度的方法是求邻接矩阵中第?i列非10元素的个数。 7.10. AOV网中,结点表示活动,边表示活动之间的优先关系,AOE网中,结点表示事件,边表示活动。 9.1. 按排序过程中依据不同原则对内部排序方法进行分类,主要有选择排序、交换排序、插入排序归并排序等4类。 9.3 .在堆排序、快速排序和归并排序中若只从排序结果的稳定性考虑,则应选择归并排序方法;若只从平均情况下 排序最快考虑,则应选择快速排序方法;若只从最坏情况下排序最快且要节省类存考虑,则应选择堆排序方法。 9.4. 直接插入排序用监视哨的作用是存当前要的插入记录,可又省去查找插入位置时对是否出界的判断。 9.6. 设表中元素的初始状态是按键值递增的,则直接插入排序最省时间,快速排序最费时间。 4.9. 下列程序判断字符串s是否对称,对称则返回1,否则返回0;如?(abba”返回1, ? (”abab”)返回0. Int f (char*s) { Int i=0,j=0;

数据结构试题及答案(免费)

一、单选题(每题 2 分,共20分) 1. 1.对一个算法的评价,不包括如下(B )方面的内容。 A.健壮性和可读性B.并行性C.正确性D.时空复杂度 2. 2.在带有头结点的单链表HL中,要向表头插入一个由指针p指向的结 点,则执行( )。 A. p->next=HL->next; HL->next=p; B. p->next=HL; HL=p; C. p->next=HL; p=HL; D. HL=p; p->next=HL; 3. 3.对线性表,在下列哪种情况下应当采用链表表示?( ) A.经常需要随机地存取元素 B.经常需要进行插入和删除操作 C.表中元素需要占据一片连续的存储空间 D.表中元素的个数不变 4. 4.一个栈的输入序列为1 2 3,则下列序列中不可能是栈的输出序列的是 ( C ) A. 2 3 1 B. 3 2 1 C. 3 1 2 D. 1 2 3 5. 5.AOV网是一种()。 A.有向图B.无向图C.无向无环图D.有向无环图 6. 6.采用开放定址法处理散列表的冲突时,其平均查找长度()。 A.低于链接法处理冲突 B. 高于链接法处理冲突 C.与链接法处理冲突相同D.高于二分查找 7.7.若需要利用形参直接访问实参时,应将形参变量说明为()参数。 A.值B.函数C.指针D.引用 8.8.在稀疏矩阵的带行指针向量的链接存储中,每个单链表中的结点都具 有相同的()。 A.行号B.列号C.元素值D.非零元素个数 9.9.快速排序在最坏情况下的时间复杂度为()。 A.O(log2n) B.O(nlog2n) C.0(n) D.0(n2) 10.10.从二叉搜索树中查找一个元素时,其时间复杂度大致为( )。 A. O(n) B. O(1) C. O(log2n) D. O(n2) 二、二、运算题(每题 6 分,共24分) 1. 1.数据结构是指数据及其相互之间的______________。当结点之间存在M 对N(M:N)的联系时,称这种结构为_____________________。 2. 2.队列的插入操作是在队列的___尾______进行,删除操作是在队列的 ____首______进行。 3. 3.当用长度为N的数组顺序存储一个栈时,假定用top==N表示栈空,则 表示栈满的条件是___top==0___(要超出才为满)_______________。 4. 4.对于一个长度为n的单链存储的线性表,在表头插入元素的时间复杂度 为_________,在表尾插入元素的时间复杂度为____________。

湖南大学实验报告

HUNAN UNIVERSITY C++ 学生姓名李国龙 学生学号201408010211 专业班级计算机科学与技术 指导老师杨圣洪 2015年12月 30日

一、实验原理:运用MFC的知识编写一个系统,实现二进制文件的创建,读取,查询,插入,修改,删除,排序,索引,基于索引的查询等功能。 二、实验目标:掌握MFC的相关知识,学会利用MFC进行文件操作系统的编写。 三、实验设计: 1、建立框架 利用 MFC Exe 模板建立 MFC 的基础界面,其中第 3 步中不选“ActiveX 控件”,在第 5 步中选择“作为静态的DLL”,其他取默认值,等你熟练后,你再百度或搜狗找办法,定制所你的喜欢的模式。项目名称为 Lt13DTextFile。建立菜单:我的文件、我的编辑在“我的文件”下方建:建立文本文件 ID_MENUITEMFILENEW、读取文本文件ID_MENUITEMFILEREAD、查询单条记录ID_MENUITEMQUERYONE、查询多条记录 ID_MENUITEMQUERYM 在“ 我的编辑” 下方建:修改 ID_MENUITEMEDITMODI 、删除ID_MENUITEMEDITDEL 、插入 ID_MENUITEMEDITINSERT 、排序ID_MENUITEMEDITSORT1 、排序 2 ID_MENUITEMEDITSORT2 、索引ID_MENUITEMEDITINDEX、根据索引查询ID_MENUITEMEDITQUERYINDEX。 单击后显示一句话。先建立菜单系统,为每个菜单项的单击事件写

上 MessageBox(NULL,"函数名","测试 ",MB_OK),等将来建立相应对话框后,再进行修改。由于保存在 LT13DTextFileView.cpp 即 View 文件中,显示对话框的命令为:voidCLt13DTextFileView::OnMenuitemeditqueryindex() { MessageBox("根据索引文件快速查询","初始代码",MB_OK); } 2、建立数据结构类 StudScore 在当前项目中建立 StudScore.h,将 LT12B 中同名文件的内容复制过来。再新建 StudScore.cpp,当我将 LT12B::StudScore.cpp 代码贴到当前文件中,再编译时出现如下错误:studscore.cpp(248) : fatal error C1010: unexpected end of file while looking for precompiled header directive,百度一下在最前面加上“#include"stdafx.h"”,这是将普通的 DOSAPP 迁移到 MFC 时发生的现象,是正常的!因为不符合 MFC 的规范。 3、建立文件操作类 StudScoreAFile 在当前项目中建立 studScoreAFile.h,将 LT12B 中同名文件的内容复制过来。建立 studScoreAFile.cpp,复制 LT12B 中相关代码,可以要进行修改,加上 include"stdafx.h"后,编译竟然能能通过,不是说 MFC 与 DOSAPP 中 C++的文件读写操作不一样吧?不再是流媒体 ofstream 或 iftream,而是采用 CStdioFile 吗?先试试看。经实际测试,只需要将以上函数中 stringstream sdata 换成

数据结构课后习题及答案

填空题(10 * 1’ = 10’) 一、概念题 .当对一个线性表经常进行的是插入和删除操作时,采用链式存储结构为宜。 .当对一个线性表经常进行的是存取操作,而很少进行插入和删除操作时,最好采用顺序存储结构。 .带头结点的单链表L中只有一个元素结点的条件是L->Next->Next==Null。 .循环队列的引入,目的是为了克服假溢出。 .长度为0的字符串称为空串。 .组成串的数据元素只能是字符。 .设T和P是两个给定的串,在T中寻找等于P的子串的过程称为模式匹配,又称P为模式。 .为了实现图的广度优先搜索,除一个标志数组标志已访问的图的结点外,还需要队列存放被访问的结点实现遍历。 .广义表的深度是广义表中括号的重数 .有向图G可拓扑排序的判别条件是有无回路。 .若要求一个稠密图的最小生成树,最好用Prim算法求解。 . 直接定址法法构造的哈希函数肯定不会发生冲突。 .排序算法所花费的时间,通常用在数据的比较和交换两大操作。 .通常从正确性﹑可读性﹑健壮性﹑时空效率等几个方面评价算法的(包括程序)的质量。 .对于给定的n元素,可以构造出的逻辑结构有集合关系﹑线性关系树形关系﹑图状关系四种。 .存储结构主要有顺序存储﹑链式存储﹑索引存储﹑散列存储四种。 .抽象数据类型的定义仅取决于它的一组逻辑特性,而与存储结构无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部使用。 .一个算法具有五大特性:有穷性﹑确定性﹑可行性,有零个或多个输入﹑有一个或多个输入。 .在双向链表结构中,若要求在p指针所指的结点之前插入指针为s所指的结点,则需执行下列语句:s->prior= p->prior; s->next= p; p->prior- next= s; p->prior= s;。 .在单链表中设置头结点的作用是不管单链表是否为空表,头结点的指针均不空,并使得对单链表的操作(如插入和删除)在各种情况下统一。 .队列是限制在表的一端进行插入和在另一端进行删除的线性表,其运算遵循先进先出原则。 .栈是限定尽在表位进行插入或删除操作的线性表。 .在链式队列中,判定只有一个结点的条件是(Q->rear==Q->front)&&(Q->rear!=NULL)。 .已知链队列的头尾指针分别是f和r,则将x入队的操作序列是node *p=(node *)malloc(node); p->next=x; p->next=NULL; if(r) {r->next=p; r=p;} else {r=p; f=p;}。 .循环队列的满与空的条件是(rear+1)%MAXSIZE==fornt和(front=-1&&rear+1==MAXSIZE)。 .串是一种特殊的线性表,其特殊性表现在数据元素都是由字符组成。 .字符串存储密度是串值所占存储位和实际分配位的比值,在字符串的链式存储结构中其结点大小是可变的。 .所谓稀疏矩阵指的是矩阵中非零元素远远小于元素总数,则称该矩阵为矩阵中非零元素远远小于元素总数,则称该矩阵为稀疏矩阵。 .一维数组的逻辑结构是线性结构,存储结构是顺序存储结构;对二维或多维数组,分别按行优先和列优先两种不同的存储方式。 .在有向图的邻接矩阵表示中,计算第i个顶点入度的方法是求邻接矩阵中第i列非0元素的个数。 网中,结点表示活动,边表示活动之间的优先关系,AOE网中,结点表示事件,边表示活动。 .按排序过程中依据不同原则对内部排序方法进行分类,主要有选择排序﹑交换排序﹑插入排序归并排序等4类。 .在堆排序、快速排序和归并排序中若只从排序结果的稳定性考虑,则应选择归并排序方法;若只从平均情况下排序最快考虑,则应选择快速排序方法;若只从最坏情况下排序最快且要节省类存考虑,则应选择堆排序方法。 .直接插入排序用监视哨的作用是存当前要的插入记录,可又省去查找插入位置时对是否出界的判断。 .设表中元素的初始状态是按键值递增的,则直接插入排序最省时间,快速排序最费时间。 .下列程序判断字符串s是否对称,对称则返回1,否则返回0;如?(“abba”)返回1,?(”abab”)返回0. Int f (char*s) { Int i=0,j=0; 求串长*/

最新湖南大学数据结构第5次作业

1 1、画出对下列存储于数组中的值执行buildheap后得到的最大值堆: 2 10 5 12 3 2 1 8 7 9 4 3 4 先序遍历为12 10 4 1 2 9 5 8 3 7 5 中序遍历为1 4 2 10 5 9 12 3 8 7 6 7 2、假设某字母表各个字母的权如下: 8 Q Z F M T S O E 9 2 3 10 10 10 15 20 30 10 (a)按照这个字母表,一个包含n个字母的字符串采用Huffman编码在最差情 11 况下需要多少位?怎样的串会出现最差情况? 12 13 在最差的情况下需要5*n位,当所有的字母都是Q或者Z的时候。 (b)按照这个字母表,包含n个字母的字符串采用Huffman编码在最佳情况 14 15 下需要多少位?怎样的串会出现最佳情况? 16 在最佳的情况下需要2*n位,当所有的字母都是E或者O的时候。 17 (c)按照一个字母表,一个字母平均需要多少位? 18 (2*30 + 2*20 + 3*15 + 3*10 + 3*10 + 4*10 + 5*3+ 5*2)/100 =2.7 19 ∴ 2.7

20 3、编写一个算法来判断两棵树是否相同。尽可能提高算法效率,并分析算法21 的运行时间代价。 22 template 23 bool Compare(GTNode* tree1, GTNode* tree2) { 24 GTNode *num1, *num2; 25 if (((tree1 == NULL) && (tree2 != NULL)) || 26 ((tree2 == NULL) && (tree1 != NULL))) 27 return 0; 28 if ((t1 == NULL) && (t2 == NULL)) return 1; 29 if (tree1->val() != tree2->val()) return 0; Num1 = tree1->left_child(); 30 31 Num2 = tree2->left_child(); 32 while(!((num1 == NULL) && (num2 == NULL))) { if (!Compare(num1, num2)) return false; 33 34 if (num1 != NULL) num1 = num1->right_value(); 35 if (num2 != NULL) num2 = num2->right_value(); 36 }} 37 38 O(n)

数据结构试题及答案

数据结构试题? 一、?单选题(每题 2 分,共20分) 1.1.???? 对一个算法的评价,不包括如下( B )方面的内容。 A.健壮性和可读性B.并行性 C.正确性 D.时空复杂度 2.2.???? 在带有头结点的单链表HL中,要向表头插入一个由指针p指向的结点, 则执行( A )。 A. p->next=HL->next; HL->next=p; B. p->next=HL; HL=p; C. p->next=HL; p=HL; D. HL=p; p->next=HL; 3.3.???? 对线性表,在下列哪种情况下应当采用链表表示?( B ) A.经常需要随机地存取元素 B.经常需要进行插入和删除操作 C.表中元素需要占据一片连续的存储空间 D.表中元素的个数不变 4.4.???? 一个栈的输入序列为 1 2 3,则下列序列中不可能是栈的输出序列的是 ( C ) A. 2 3 1 B. 3 2 1 C. 3 1 2 D. 1 2 3 5.5.???? AOV网是一种( D )。 A.有向图 B.无向图 C.无向无环图D.有向无环图 6.6.???? 采用开放定址法处理散列表的冲突时,其平均查找长度( B )。 A.低于链接法处理冲突 B. 高于链接法处理冲突 C.与链接法处理冲突相同 D.高于二分查找 7.7.???? 若需要利用形参直接访问实参时,应将形参变量说明为( D )参数。 A.值 B.函数 C.指针 D.引用 8.8.???? 在稀疏矩阵的带行指针向量的链接存储中,每个单链表中的结点都具有 相同的( A )。 A.行号B.列号 C.元素值 D.非零元素个数 9.9.???? 快速排序在最坏情况下的时间复杂度为( D )。 A.O(log 2n) B.O(nlog 2 n) C.O(n) D.O(n2) 10.10. 从二叉搜索树中查找一个元素时,其时间复杂度大致为( C )。 A. O(n) B. O(1) C. O(log 2 n) D. O(n2) 二、运算题(每题 6 分,共24分) 1. 1.?数据结构是指数据及其相互之间的_对应关系(联系)。当结点之间存在M对N(M: N)的联系时,称这种结构为图(或图结构)。 2. 2.队列的插入操作是在队列的__队尾___进行,删除操作是在队列的_对头_进行。 3. 3.??当用长度为N的数组顺序存储一个栈时,假定用top==N表示栈空,则表示栈 满的条件是_top==0__。 4. 4.???对于一个长度为n的单链存储的线性表,在表头插入元素的时间复杂度为

最新湖南大学数据结构第5次作业

1、画出对下列存储于数组中的值执行buildheap后得到的最大值堆: 10 5 12 3 2 1 8 7 9 4 先序遍历为12 10 4 1 2 9 5 8 3 7 中序遍历为1 4 2 10 5 9 12 3 8 7 2、假设某字母表各个字母的权如下: Q Z F M T S O E 2 3 10 10 10 15 20 30 (a)按照这个字母表,一个包含n个字母的字符串采用Huffman编码在最差情况下需要多少位?怎样的串会出现最差情况? 在最差的情况下需要5*n位,当所有的字母都是Q或者Z的时候。 (b)按照这个字母表,包含n个字母的字符串采用Huffman编码在最佳情况下需要多少位?怎样的串会出现最佳情况? 在最佳的情况下需要2*n位,当所有的字母都是E或者O的时候。 (c)按照一个字母表,一个字母平均需要多少位? (2*30 + 2*20 + 3*15 + 3*10 + 3*10 + 4*10 + 5*3+ 5*2)/100 =2.7 ∴ 2.7 3、编写一个算法来判断两棵树是否相同。尽可能提高算法效率,并分析算法的运行时间代价。 template bool Compare(GTNode* tree1, GTNode* tree2) { GTNode *num1, *num2; if (((tree1 == NULL) && (tree2 != NULL)) || ((tree2 == NULL) && (tree1 != NULL))) return 0; if ((t1 == NULL) && (t2 == NULL)) return 1; if (tree1->val() != tree2->val()) return 0; Num1 = tree1->left_child();

数据结构(C++版)课后作业1-6章带答案

数据结构(C++版)课后作业 1-6章带答案 标准化文件发布号:(9312-EUATWW-MWUB-WUNN-INNUL-DQQTY-

第1 章绪论 课后习题讲解 1. 填空 (1) 从逻辑关系上讲,数据结构主要分为()、()、()和()。 (2) 数据的存储结构主要有()和()两种基本方法,不论哪种存储结构,都要存储两方面的内容:()和()。 (3)算法在发生非法操作时可以作出处理的特性称为()。 2. 选择题 ⑴顺序存储结构中数据元素之间的逻辑关系是由()表示的,链接存储结构中的数据元素之间的逻辑关系是由()表示的。 A 线性结构 B 非线性结构C 存储位置 D 指针 ⑵假设有如下遗产继承规则:丈夫和妻子可以相互继承遗产;子女可以继承父亲或母亲的遗产;子女间不能相互继承。则表示该遗产继承关系的最合适的数据结构应该是()。 A 树 B 图 C 线性表 D 集合 3. 判断题 (1) 每种数据结构都具备三个基本操作:插入、删除和查找。 第2 章线性表 课后习题讲解 1. 填空 ⑵顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的存储地址是()。第5个元素的存储地址=第1个元素的存储地址+(5-1)×2=108 ⑶设单链表中指针p 指向结点A,若要删除A的后继结点(假设A存在后继结点),则需修改指针的操作为()。【解答】p->next=(p->next)->next ⑸非空的单循环链表由头指针head指示,则其尾结点(由指针p所指)满足()。p->next=head ⑹在由尾指针rear指示的单循环链表中,在表尾插入一个结点s的操作序列是();删除开始结点的操作序列为()。。【解答】s->next =rear->next; rear->next =s; rear =s; q=rear->next->next; rear->next->next=q->next; delete q; 2. 选择题 ⑴线性表的顺序存储结构是一种()的存储结构,线性表的链接存储结构是一种()的存储结构。 A 随机存取 B 顺序存取 C 索引存取 D 散列存取【解答】A,B 【分析】参见2.2.1。 ⑵线性表采用链接存储时,其地址()。 A 必须是连续的 B 部分地址必须是连续的 C 一定是不连续的 D 连续与否均可以【解答】D 【分析】线性表的链接存储是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以连续,也可以不连续,甚至可以零散分布在内存中任意位置。

数据结构习题与答案

第 1 章绪论 课后习题讲解 1. 填空 ⑴()是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 【解答】数据元素 ⑵()是数据的最小单位,()是讨论数据结构时涉及的最小数据单位。 【解答】数据项,数据元素 【分析】数据结构指的是数据元素以及数据元素之间的关系。 ⑶从逻辑关系上讲,数据结构主要分为()、()、()和()。 【解答】集合,线性结构,树结构,图结构 ⑷数据的存储结构主要有()和()两种基本方法,不论哪种存储结构,都要存储两方面的内容:()和()。 【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系 ⑸算法具有五个特性,分别是()、()、()、()、()。 【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性 ⑹算法的描述方法通常有()、()、()和()四种,其中,()被称为算法语言。 【解答】自然语言,程序设计语言,流程图,伪代码,伪代码 ⑺在一般情况下,一个算法的时间复杂度是()的函数。 【解答】问题规模 ⑻设待处理问题的规模为n,若一个算法的时间复杂度为一个常数,则表示成数量级的形式为(),若为n*log25n,则表示成数量级的形式为()。 【解答】Ο(1),Ο(nlog2n) 【分析】用大O记号表示算法的时间复杂度,需要将低次幂去掉,将最高次幂的系数去掉。 2. 选择题 ⑴顺序存储结构中数据元素之间的逻辑关系是由()表示的,链接存储结构中的数据元素之间的逻辑关系是由()表示的。 A 线性结构 B 非线性结构 C 存储位置 D 指针 【解答】C,D 【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。

《数据结构》课后参考答案

单元练习1 一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳) (√)(1)数据的逻辑结构与数据元素本身的内容和形式无关。 (√)(2)一个数据结构是由一个逻辑结构和这个逻辑结构上的一个基本运算集构成的整体。(ㄨ)(3)数据元素是数据的最小单位。 (ㄨ)(4)数据的逻辑结构和数据的存储结构是相同的。 (ㄨ)(5)程序和算法原则上没有区别,所以在讨论数据结构时可以通用。 (√)(6)从逻辑关系上讲,数据结构主要分为线性结构和非线性结构两类。 (√)(7)数据的存储结构是数据的逻辑结构的存储映像。 (√)(8)数据的物理结构是指数据在计算机内实际的存储形式。 (ㄨ)(9)数据的逻辑结构是依赖于计算机的。 (√)(10)算法是对解题方法和步骤的描述。 二.填空题 (1)数据有逻辑结构和存储结构两种结构。 (2)数据逻辑结构除了集合以外,还包括:线性结构、树形结构和图形结构。(3)数据结构按逻辑结构可分为两大类,它们是线性结构和非线性结构。 (4)树形结构和图形结构合称为非线性结构。 (5)在树形结构中,除了树根结点以外,其余每个结点只有 1 个前趋结点。 (6)在图形结构中,每个结点的前趋结点数和后续结点数可以任意多个。 (7)数据的存储结构又叫物理结构。 (8)数据的存储结构形式包括:顺序存储、链式存储、索引存储和散列存储。(9)线性结构中的元素之间存在一对一的关系。 (10)树形结构结构中的元素之间存在一对多的关系, (11)图形结构的元素之间存在多对多的关系。 (12)数据结构主要研究数据的逻辑结构、存储结构和算法(或运算)三个方面的内容。 (13)数据结构被定义为(D,R),其中D是数据的有限集合,R是D上的关系的有限集合。 (14)算法是一个有穷指令的集合。 (15)算法效率的度量可以分为事先估算法和事后统计法。 (16)一个算法的时间复杂性是算法输入规模的函数。 (17)算法的空间复杂度是指该算法所耗费的存储空间,它是该算法求解问题规模n 的函数。 (18)若一个算法中的语句频度之和为T(n)=6n+3nlog2n,则算法的时间复杂度为 O (nlog2n)。 (19)若一个算法中的语句频度之和为T(n)=3n+nlog2n+n2,则算法的时间复杂度为 O

数据结构试题及答案

第一章概论 一、选择题 1、研究数据结构就是研究(D)。 A. 数据的逻辑结构?B。数据的存储结构 C。数据的逻辑结构和存储结构?D.数据的逻辑结构、存储结构及其基本操作(研究非数值计算的程序设计问题中,计算机操作对象以及他们之间的关系和操作) 2、算法分析的两个主要方面是(A)。 A.空间复杂度和时间复杂度???B。正确性和简单性 C。可读性和文档性D.数据复杂性和程序复杂性 3、具有线性结构的数据结构是( D )。(线性结构就是:在非空有限集合中,存在为一个被称为第一个的数据元素和最后一个元素,有除了第一个元素,集合中每一个元素均只有一个前驱,除了最后一个元素有唯一后继)(链表、栈、队列、数组、串) A. 图B. 树??C.广义表(线性表的推广) D.栈 4、计算机中的算法指的是解决某一个问题的有限运算序列,它必须具备输入、输出、( B )等5个特性。 A.可执行性、可移植性和可扩充性? B. 可执行性、有穷性和确定性 C。确定性、有穷性和稳定性??? D. 易读性、稳定性和确定性 5、下面程序段的时间复杂度是( C )。 for(i=0;i

湖南大学数据结构试验图遍历问题

HUNAN UNIVERSITY 课程实习报告 题目:图的遍历问题 学生姓名刘乐 学生学号20080820208 专业班级通信工程2班 指导老师朱宁波 完成日期2010年5月17日 一、问题描述: 从图中某个顶点出发访问图中所有顶点,且使得每一顶点仅被访问一次,这个过程称为图的遍历。图的遍历是从图中某个顶点出发,沿着某条搜索路径对图中其余每个顶点进行访问, 并且使图中的每个顶点仅被访问一次的过程。 二、基本要求: 1、实现无向图的深度优先遍历和广度优先遍历。 2、分别输出每种遍历下的结点访问序列.从图中某个顶点出发,沿着某条搜索路径对图中每个顶点各做一次且仅做一次访问。它

是许多图的算法的基础。 三、实验主要模块构造思想: 深度优先搜索的过程 a 基本思想: 首先访问图中某一个指定的出发点Vi; 然后任选一个与顶点Vi相邻的未被访问过的顶点Vj; 以Vj为新的出发点继续进行深度优先搜索,直至图中所有顶点均被访问过。 b具体过程: 设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y)。若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y 出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。上述过程直至从x出发的所有边都已检测过为止。此时,若x不是源点,则回溯到在x之前被访问过的顶点;否则图中所有和源点有路径相通的顶点(即从源点可达的所有顶点)都已被访问过,若图G是连通图,则遍历过程结束,否则继续选择一个尚未被访问的顶点作为新源点,进行新的搜索过程。 广度优先遍历(Breadth-First Traverse): 特点:尽可能先从指定的出发点,横向地访问图中各个顶点。 1.广度优先遍历的定义 在访问了起始点之后,首先依次访问起始点的各个邻接点,然后依次访问这些顶点中未被访问过的邻接点.依此类推,直到所有被访问到的顶点的邻接点都被访问过为止. 2. 广度优先搜索的过程 a算法基本思想: 首先访问图中某一指定的出发点Vi; 然后依次访问Vi的所有接点Vi1,Vi2…Vit; 再次访问Vi1,Vi2…,Vit的邻接点中未经访问过的顶点,依此类推,直到图中所有顶点均被访问为止。 b具体过程: 从广度优先搜索遍历方法可知,先被访问的顶点的邻接点也被访问,即假设顶点V在W之前被访问,那么顶点V的所有未经访问的邻接点也在顶点W的所有未经访问的邻接点之前被访问。这样可以在广度优先遍历的算法中设置一个队列结构,用以保存已访问过的顶点的序号,访问该顶点的所有未经访问的顶点。 广度优先搜索是一种分层的搜索过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样会出现回退的现象。因此它不是个递归的过程。为了实现逐层访问,算法中使用了一个队列以记忆正在访问的这一层和上一层的顶点,以便于向下一层访问。为了避免重复访问,需要一个辅助函数visitvex[]给被

严蔚敏版数据结构课后习题答案-完整版

第1章绪论 1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。 解:数据是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 数据对象是性质相同的数据元素的集合,是数据的一个子集。 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 存储结构是数据结构在计算机中的表示。 数据类型是一个值的集合和定义在这个值集上的一组操作的总称。 抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。是对一般数据类型的扩展。 1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。 解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。抽象数据

类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。 1.3 设有数据结构(D,R),其中 {}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r = 试按图论中图的画法惯例画出其逻辑结构图。 解: 1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。 解: ADT Complex{ 数据对象:D={r,i|r,i 为实数} 数据关系:R={} 基本操作: InitComplex(&C,re,im) 操作结果:构造一个复数C ,其实部和虚部分别为re 和im DestroyCmoplex(&C)

十套数据结构试题与答案

数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 (一) (二) (三) (四) (五) (六) (七 )(八 ) (九 ) (十 ) 9 12 15 17 19 21 24 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 数据结构试卷 (一) (二) (三 ) (四 ) (五 ) (六) (七) (八) (九) (十 ) 27 28 29 31 33 35 37 38 39 40 数据结构试卷(一) 、单选题(每题 栈和队列的共同特点是(A ) 。 A. 只允许在端点处插入和删除元素 B. 都是先进后出 C. 都是先进先出 D. 没有共同点 用链接方式存储的队列,在进行插入运算时 (C ). 头、尾指针都要修改 头、尾指针可能都要修改 (D ) 线性表 2分,共20分) 1. 2. A. C. 3. A. 4. 仅修改头指针 B. 仅修改尾指针 D. 以下数据结构中哪一个是非线性结构? 队列 B.栈 C. 设有一个二维数组 A[m][ n],假设 个空间,问 676(10),每个元素占 制表示。 .688 D. 二叉树 A[2][2]存放位置在 (10)存放在什么位置?脚注(10)表示用10进 A[0][0] 存放位置在644(10), A[3][3] .678 C C ) 。 B. A 5.树最适合用来表示( A.有序数据元素 C.元素之间具有分支层次关系的数据 二叉树的第k 层的结点数最多为(D ). k .2 -1 B.2K+1 C.2K-1 若有18个元素的有序表存放在一维数组 6. A 7. 692 D . 696 D. 无序数据元素 乙间无联系的数 据 元素之 f k-1 D. 2 A[19]中,第一个元素放 A[1]中,现进行二 分查找,则查找 A : 3 ]的比较序列的下标依次为 (C ) A. 1 , 2, 3 B. 9 , 5, 2, 3 C. 9 , 5, 3 D. 9 , 4, 2, 3 对n 个记录的文件进行快速排序,所需要的辅助存储空间大致为 D. O 8. A. O (1) B. O (n ) C. O (1og 2n ) D. O (n2) 9. 对于线性表(7, 34, 55, 25, 64, 46, 20, 10)进行散列存储时,若选用 H (K ) =K %9作为散列函数,则散列地址为 1的元素有(D )个, A . 1 B . 2 C . 3 10. 设有6个结点的无向图,该图至少应有 ( A.5 B.6 C.7 D.8 二、填空题(每空 1分,共26分) 1.通常从四个方面评价算法的质量: _ 高效率 _______ 和―强壮性 _______ 。 1. 一个算法的时间复杂度为(n 3 +nlog 2n+14n)/ n 2 ,其数量级表示为 —o(n) ____________________ 。 2. 假定一棵树的广义表表示为 A (C, D (E , F , G , H( I , J )),则树中所含的结点数为 __________ 个,树的深度为 ____________ ,树的度为 ___________ 。 .4 条边才能确保是一个连通图。 正确性 易读性

大学数据结构期末考试试题(有答案)

“数据结构”期末考试试题 一、单选题(每小题2分,共12分) 1.在一个单链表HL中,若要向表头插入一个由指针p指向的结点,则执行( )。 A. HL=ps p一>next=HL B. p一>next=HL;HL=p3 C. p一>next=Hl;p=HL; D. p一>next=HL一>next;HL一>next=p; 2.n个顶点的强连通图中至少含有( )。 A.n—l条有向边 B.n条有向边 C.n(n—1)/2条有向边 D.n(n一1)条有向边 3.从一棵二叉搜索树中查找一个元素时,其时间复杂度大致为( )。 A.O(1) B.O(n) C.O(1Ogzn) D.O(n2) 4.由权值分别为3,8,6,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为( )。 A.24 B.48 C. 72 D. 53 5.当一个作为实际传递的对象占用的存储空间较大并可能需要修改时,应最好把它说明为( )参数,以节省参数值的传输时间和存储参数的空间。 A.整形 B.引用型 C.指针型 D.常值引用型· 6.向一个长度为n的顺序表中插人一个新元素的平均时间复杂度为( )。 A.O(n) B.O(1) C.O(n2) D.O(10g2n) 二、填空题(每空1分,共28分) 1.数据的存储结构被分为——、——、——和——四种。 2.在广义表的存储结构中,单元素结点与表元素结点有一个域对应不同,各自分别为——域和——域。 3.——中缀表达式 3十x*(2.4/5—6)所对应的后缀表达式为————。 4.在一棵高度为h的3叉树中,最多含有——结点。 5.假定一棵二叉树的结点数为18,则它的最小深度为——,最大深度为——· 6.在一棵二叉搜索树中,每个分支结点的左子树上所有结点的值一定——该结点的值,右子树上所有结点的值一定——该结点的值。 7.当向一个小根堆插入一个具有最小值的元素时,该元素需要逐层——调整,直到被调整到——位置为止。 8.表示图的三种存储结构为——、——和———。 9.对用邻接矩阵表示的具有n个顶点和e条边的图进行任一种遍历时,其时间复杂度为——,对用邻接表表示的图进行任一种遍历时,其时间复杂度为——。 10.从有序表(12,18,30,43,56,78,82,95)中依次二分查找43和56元素时,其查找长度分别为——和——· 11.假定对长度n=144的线性表进行索引顺序查找,并假定每个子表的长度均为,则进行索引顺序查找的平均查找长度为——,时间复杂度为——· 12.一棵B—树中的所有叶子结点均处在——上。 13.每次从无序表中顺序取出一个元素,把这插入到有序表中的适当位置,此种排序方法叫做——排序;每次从无序表中挑选出一个最小或最大元素,把它交换到有序表的一端,此种排序方法叫做——排序。 14.快速排序在乎均情况下的时间复杂度为——,最坏情况下的时间复杂度为——。 三、运算题(每小题6分,共24分) 1.假定一棵二叉树广义表表示为a(b(c,d),c(((,8))),分别写出对它进行先序、中序、后序和后序遍历的结果。 先序: 中序; 后序: 2.已知一个带权图的顶点集V和边集G分别为: V={0,1,2,3,4,5}; E={(0,1)8,(0,2)5,(0,3)2,(1,5)6,(2,3)25,(2,4)13,(3,5)9,(4,5)10}, 则求出该图的最小生成树的权。 最小生成树的权; 3.假定一组记录的排序码为(46,79,56,38,40,84,50,42),则利用堆排序方法建立的初始堆为——。 4.有7个带权结点,其权值分别为3,7,8,2,6,10,14,试以它们为叶子结点生成一棵哈夫曼树,求出该树的带权路径长度、高度、双分支结点数。 带权路径长度:——高度:——双分支结点数:——。 四、阅读算法,回答问题(每小题8分,共16分) 1.VOldAC(List&L) { InitList(L); InsertRear(L;25);

相关主题
文本预览
相关文档 最新文档