14级数据结构考试真题及答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int data;//数据域
} BinTreeNodeExt;//结点数据类型
typedef pair<int, BinTreeNodeExt *>StackNodeExt;//堆栈结点,第一个域(first)
//为结点(1)或树(0)标记;
//第二个域(second)为指针
typedef stack<StackNodeExt>NodeStackExt;//堆栈数据类型
Return;
ListNode*p =head->link;
While(p)
{
If((p->data>min)&&(p->data<max))
{
ListNode*q=p->link;
Delete p;
p=q;
}
p=p->link;
}
}
2.(6分)编写一个算法(递归或非递归算法均可),统计一棵二叉树中非叶结点的个数。编写程序时,请使用以下结点数据类型定义和函数原型,只需要完成该函数的实现部分即可。
D.以上都不是
8.以下关于“堆”的叙述,正确的是(C)。
A.堆是二叉排序树
B.堆是满二叉树
C.堆是完全二叉树
D.以上都不是
9.快速排序的最优时间复杂度为(C )。
A.O(n)
B.O(n2)
C.O(nlog2n)
D.以上都不是
10.下面( B)方法可以判断出一个有向图中是否有环(回路)。
A.深度优先遍历
{
//设置q的后继线索标记,q的后继为root
q->rthread = 1;
q->rchild = root;
}
//前驱结点指针q向后推移
④q=q->lchild;q=root
}
else//视当前指针为树的根指针
{
//1:当前根结点入栈
⑤s.push(root);s.push(StackNodeExt(1, root));
int mid;//区间中点
bot = 0;top = size;
while(bot < top)
{
mid =①(bot+top)/2;
if (list[mid] < x)
bot = mid+1;
else if (list[mid] > x)
②top=mid;
else
return③mid;
}
return-1;
/*返回值:若查找成功则返回该元素在序列中的位置,否则返回-1 */
template <class ElemType>
intbinary_search(const ElemType*list, int size, const ElemType& x)
{
intbot,top;//当前查找区间,半闭半开区间:[bot,top)
A.b c d a e
B.e d a c b
C.e c a d b
D.以上都不是
3.表达式a*(b+c)-d的后缀表达式是( B)
A .abcd*+-B.abc+*d–
C .abc*+d–D.-+*abcd
4.设A为8×10的二维数组,每个数组元素的长度为4个字节,数组元素以行为主序存放,且数组首地址为SA,则元素A[6][8]的起始地址为(B )。
//结点数据类型定义
typedef struct _BinTreeNode
{
int data;//数据域
struct _BinTreeNode *lchild, *rchild;//左右孩子结点指针
} BinTreeNode;//结点数据类型
//CountInnerNodes统计指定的二叉树中非叶结点的个数
//root为二叉树根结点指针;
//函数返回值为非叶结点的个数
int CountInnerNodes(const BinTreeNode *root);
{
Int count=0;
If(root==NULL)
Return 0;
If(root->lchild||root->rchild)
count++;
q = NULL;
//初始时整棵树入栈
s.push(StackNodeExt(0, root));
while (!s.empty())
{
//获取栈顶元素,并出栈
flag = s.top().first;
root = s.top().second;
s.pop();
if (flag == 1)//视当前指针为结点指针
B.拓扑排序
C.广度优先遍历
D.求关键路径
二、判断题(每题2分8*2=16)
1.线性表的链式存储结构优于顺序存储结构。(F)
2.循环队列是允许在两端都可以插入和删除的线性表。(F)
3.希尔排序是稳定的排序算法。(F)
4.二叉树是度为2的树。(F)
5.二叉树的Байду номын сангаас序遍历序列和中序遍历序列可以惟一确定这棵二叉树。(T)
6.设有n个结点的完全二叉树顺序存放在数组A[0…n-1]中,对任意结点A[i],若A[i]有右孩子结点,则其右孩子结点是(D )
A.A[i/2]
B.A[2*i]
C.A[2*i+1]
D.A[2*i+2]
7.顺序查找方法中,设置“监视哨”是为了(A )。
A.减少比较次数
B.减少记录移动次数
C.防止越界错误
1.以上述关键字序列作为输入,
(1)请画出相应的二叉排序树;
(2)在(1)基础上画出删除结点49后的二叉排序树。
2.请分别写出快速排序法(取第一个元素为基准元素)、Shell排序(取初始间距为5)的第一趟排序结果,使待排序序列非递减有序。
3.请分别写出以下有向图的深度优先遍历序列、广度优先遍历序列和拓扑排序序列。
6.有n(n>=1)个顶点的无向连通图最少有n条边。(F)
7.完全二叉树中,若一个结点没有左孩子,则它必是叶子结点。(T)
8.折半查找只能在顺序表上进行。(T)
前提是有序递增的序列,存储在数组中
三、简答题
给定以下关键字序列:{31,25,49,25*,93,62,75,08,37,61,54},完成第1、2小题。
}
2.下面是二叉树后序线索化的非递归算法,其中有一些语句缺失,请根据算法的功能补充之。
//数据类型定义
typedef struct _BinTreeNodeExt
{
int lthread, rthread;//线索标记,1为线索,0为
//实际孩子结点指针
struct _BinTreeNodeExt *lchild, *rchild;//左右孩子结点指针
count += CountInnerNodes(root->lchild)+CountInnerNodes(root->rchild);
Return count;
}
}
五、编程题(2小题,共16分)
1.(10分) 编写程序,删除带头结点的单链表中值大于min且小于max(min < max)的所有元素,并释放相对应结点的空间。编写程序时,请使用以下的数据类型定义和函数原型,只需要完成该函数的实现部分即可。
//单链表结点数据类型定义
typedef struct _listNode
/*创建线索化二叉树。*/
/*参数:root -树根指针*/
void create_thread(constBinTreeNodeExt *root)
{
BinTreeNodeExt* q;//q为前驱结点指针
NodeStackExt s;// s为堆栈
int flag;
//若为空树,直接返回。
if (①root==NULL)return;
{
//若root无左孩子,设置前驱线索标记
if (root->lchild == NULL)
{
//设置root的前驱线索标记,root的前驱为q
root->lthread = 1;
②root->rchild=q;
}
//若前驱结点q存在,且无右孩子,设置后继线索标记
if (③q&&q->rchild==NULL)
A.SA+68
B.SA+272
C.SA+232
D.以上都不是
5.一组记录的关键字为{40,80,55,45,42,85},则利用堆排序的方法建立的初始堆(大顶堆)为(C )。
A.80 45 50 40 42 85
B.85 80 55 40 42 45
C.85 80 55 45 42 40
D.以上都不是
深度:1、2、4、6、5、3
广度:1、2、3、4、5、6
拓扑:1、3、2、4、5、6
四、程序填空题(每空3分,共24分)
1.下面是折半查找的算法,其中有一些语句缺失,请根据算法的功能补充之。
/*折半查找*/
/*参数:list-关键字序列(非递减有序)*/
/*参数:size-关键字序列长度*/
/*参数:x-待查找元素*/
//2:如有右子树,右子树根指针入栈
if (root->rchild)s.push(StackNodeExt(0, root->rchild));
// 3:如有左子树,左子树根指针入栈
if (root->lchild)s.push(StackNodeExt(0, root->lchild));
}
}
return;
{
int data;
struct _listNode* link;
} ListNode;
/*函数的原型*/
/*参数:head-单链表头结点指针*/
/*参数:min、max为删除结点的取值范围*/
voidDeleteNodes(ListNode*&head, int min, int max);
{
if(head==NULL)
一、选择填空题(每题2分10*2=20)
1.单链表中,删去p指向的结点的后继结点,可以执行(A)操作实现。
A.p->link = p->link->link;
B.p->link = NULL;
C.p->link->link = NULL;
D.以上都不是
2.一个栈的输入序列是a,b,c,d,e,则下列哪个是合法输出序列(A )。
} BinTreeNodeExt;//结点数据类型
typedef pair<int, BinTreeNodeExt *>StackNodeExt;//堆栈结点,第一个域(first)
//为结点(1)或树(0)标记;
//第二个域(second)为指针
typedef stack<StackNodeExt>NodeStackExt;//堆栈数据类型
Return;
ListNode*p =head->link;
While(p)
{
If((p->data>min)&&(p->data<max))
{
ListNode*q=p->link;
Delete p;
p=q;
}
p=p->link;
}
}
2.(6分)编写一个算法(递归或非递归算法均可),统计一棵二叉树中非叶结点的个数。编写程序时,请使用以下结点数据类型定义和函数原型,只需要完成该函数的实现部分即可。
D.以上都不是
8.以下关于“堆”的叙述,正确的是(C)。
A.堆是二叉排序树
B.堆是满二叉树
C.堆是完全二叉树
D.以上都不是
9.快速排序的最优时间复杂度为(C )。
A.O(n)
B.O(n2)
C.O(nlog2n)
D.以上都不是
10.下面( B)方法可以判断出一个有向图中是否有环(回路)。
A.深度优先遍历
{
//设置q的后继线索标记,q的后继为root
q->rthread = 1;
q->rchild = root;
}
//前驱结点指针q向后推移
④q=q->lchild;q=root
}
else//视当前指针为树的根指针
{
//1:当前根结点入栈
⑤s.push(root);s.push(StackNodeExt(1, root));
int mid;//区间中点
bot = 0;top = size;
while(bot < top)
{
mid =①(bot+top)/2;
if (list[mid] < x)
bot = mid+1;
else if (list[mid] > x)
②top=mid;
else
return③mid;
}
return-1;
/*返回值:若查找成功则返回该元素在序列中的位置,否则返回-1 */
template <class ElemType>
intbinary_search(const ElemType*list, int size, const ElemType& x)
{
intbot,top;//当前查找区间,半闭半开区间:[bot,top)
A.b c d a e
B.e d a c b
C.e c a d b
D.以上都不是
3.表达式a*(b+c)-d的后缀表达式是( B)
A .abcd*+-B.abc+*d–
C .abc*+d–D.-+*abcd
4.设A为8×10的二维数组,每个数组元素的长度为4个字节,数组元素以行为主序存放,且数组首地址为SA,则元素A[6][8]的起始地址为(B )。
//结点数据类型定义
typedef struct _BinTreeNode
{
int data;//数据域
struct _BinTreeNode *lchild, *rchild;//左右孩子结点指针
} BinTreeNode;//结点数据类型
//CountInnerNodes统计指定的二叉树中非叶结点的个数
//root为二叉树根结点指针;
//函数返回值为非叶结点的个数
int CountInnerNodes(const BinTreeNode *root);
{
Int count=0;
If(root==NULL)
Return 0;
If(root->lchild||root->rchild)
count++;
q = NULL;
//初始时整棵树入栈
s.push(StackNodeExt(0, root));
while (!s.empty())
{
//获取栈顶元素,并出栈
flag = s.top().first;
root = s.top().second;
s.pop();
if (flag == 1)//视当前指针为结点指针
B.拓扑排序
C.广度优先遍历
D.求关键路径
二、判断题(每题2分8*2=16)
1.线性表的链式存储结构优于顺序存储结构。(F)
2.循环队列是允许在两端都可以插入和删除的线性表。(F)
3.希尔排序是稳定的排序算法。(F)
4.二叉树是度为2的树。(F)
5.二叉树的Байду номын сангаас序遍历序列和中序遍历序列可以惟一确定这棵二叉树。(T)
6.设有n个结点的完全二叉树顺序存放在数组A[0…n-1]中,对任意结点A[i],若A[i]有右孩子结点,则其右孩子结点是(D )
A.A[i/2]
B.A[2*i]
C.A[2*i+1]
D.A[2*i+2]
7.顺序查找方法中,设置“监视哨”是为了(A )。
A.减少比较次数
B.减少记录移动次数
C.防止越界错误
1.以上述关键字序列作为输入,
(1)请画出相应的二叉排序树;
(2)在(1)基础上画出删除结点49后的二叉排序树。
2.请分别写出快速排序法(取第一个元素为基准元素)、Shell排序(取初始间距为5)的第一趟排序结果,使待排序序列非递减有序。
3.请分别写出以下有向图的深度优先遍历序列、广度优先遍历序列和拓扑排序序列。
6.有n(n>=1)个顶点的无向连通图最少有n条边。(F)
7.完全二叉树中,若一个结点没有左孩子,则它必是叶子结点。(T)
8.折半查找只能在顺序表上进行。(T)
前提是有序递增的序列,存储在数组中
三、简答题
给定以下关键字序列:{31,25,49,25*,93,62,75,08,37,61,54},完成第1、2小题。
}
2.下面是二叉树后序线索化的非递归算法,其中有一些语句缺失,请根据算法的功能补充之。
//数据类型定义
typedef struct _BinTreeNodeExt
{
int lthread, rthread;//线索标记,1为线索,0为
//实际孩子结点指针
struct _BinTreeNodeExt *lchild, *rchild;//左右孩子结点指针
count += CountInnerNodes(root->lchild)+CountInnerNodes(root->rchild);
Return count;
}
}
五、编程题(2小题,共16分)
1.(10分) 编写程序,删除带头结点的单链表中值大于min且小于max(min < max)的所有元素,并释放相对应结点的空间。编写程序时,请使用以下的数据类型定义和函数原型,只需要完成该函数的实现部分即可。
//单链表结点数据类型定义
typedef struct _listNode
/*创建线索化二叉树。*/
/*参数:root -树根指针*/
void create_thread(constBinTreeNodeExt *root)
{
BinTreeNodeExt* q;//q为前驱结点指针
NodeStackExt s;// s为堆栈
int flag;
//若为空树,直接返回。
if (①root==NULL)return;
{
//若root无左孩子,设置前驱线索标记
if (root->lchild == NULL)
{
//设置root的前驱线索标记,root的前驱为q
root->lthread = 1;
②root->rchild=q;
}
//若前驱结点q存在,且无右孩子,设置后继线索标记
if (③q&&q->rchild==NULL)
A.SA+68
B.SA+272
C.SA+232
D.以上都不是
5.一组记录的关键字为{40,80,55,45,42,85},则利用堆排序的方法建立的初始堆(大顶堆)为(C )。
A.80 45 50 40 42 85
B.85 80 55 40 42 45
C.85 80 55 45 42 40
D.以上都不是
深度:1、2、4、6、5、3
广度:1、2、3、4、5、6
拓扑:1、3、2、4、5、6
四、程序填空题(每空3分,共24分)
1.下面是折半查找的算法,其中有一些语句缺失,请根据算法的功能补充之。
/*折半查找*/
/*参数:list-关键字序列(非递减有序)*/
/*参数:size-关键字序列长度*/
/*参数:x-待查找元素*/
//2:如有右子树,右子树根指针入栈
if (root->rchild)s.push(StackNodeExt(0, root->rchild));
// 3:如有左子树,左子树根指针入栈
if (root->lchild)s.push(StackNodeExt(0, root->lchild));
}
}
return;
{
int data;
struct _listNode* link;
} ListNode;
/*函数的原型*/
/*参数:head-单链表头结点指针*/
/*参数:min、max为删除结点的取值范围*/
voidDeleteNodes(ListNode*&head, int min, int max);
{
if(head==NULL)
一、选择填空题(每题2分10*2=20)
1.单链表中,删去p指向的结点的后继结点,可以执行(A)操作实现。
A.p->link = p->link->link;
B.p->link = NULL;
C.p->link->link = NULL;
D.以上都不是
2.一个栈的输入序列是a,b,c,d,e,则下列哪个是合法输出序列(A )。