上海交通大学试卷A卷NO
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
班级姓名学号分数
一、编程序题(本大题共计二小题,共计40 分,第1题25 分,第2题15分。)
1、设在二叉排序树的每个结点中,含类型为Type 的数据场data 域。当向该二叉排
序树中插入一个数据值为key 的新结点时,若二叉排序树中已存在数据值为key的结点,则插入失败,并返回0;否则就创建一个数据值为key的结点,然后将其插入到该二叉排序树中并仍满足二叉排序树的性质,且返回1。按照这种插入要求,请编写一个二叉排序树的成员函数Insert_key(const Type & key,BSTNode
该二叉排序树的结点定义如下:
template
struct BSTNode { // 二叉排序树的结点的表示。
Type data; // 结点的数据值。
BSTNode * left; // 给出结点的左儿子的地址。
BSTNode * right; // 给出结点的右儿子的地址。
BSTNode ( ): left(NULL), right(NULL) { }
~BSTNode( ) { }
};
二叉排序树类BinarySearchTree的定义如下:
template
class BinarySearchTree{
public:
BinarySearchTree ( ) : Root(NULL) { }
~BinarySearchTree ( ) { }
int Insert_key (const Type & key ) { return Insert_key ( key,Root ); }
……
protected:
BSTNode
int Insert_key (const Type & key,BSTNode
……
};
班级姓名学号请在此书写第1小题的答案:
班级姓名学号
2. 已知单链表类及其单链表结点类的定义如下:
template < class ElemType> class List; // 单链表类的向前说明。
template < class ElemType> class ListNode{ // 结点类
friend class List
// 单链表类为其友元类, 便于访问结点类中的私有成员。
public:
ListNode( ):Next(NULL){ }
~ListNode( ) { }
private:
ListNode
ElemType Element; // 结点数据场。
};
template
private:
ListNode
// head为指向头结点的指针,头结点的指针场给出该链表中的第一个结点的地址。
public:
List( ) { head = new ListNode< ElemType >( ); }
~ List( ) { MakeEmpty( ); delete head; } // 析构函数:将单链表清空,具体实现略。
int Count ( );
// 该函数统计单链表中的(不含头结点)结点总数。若表空,则返回0;否则
// 返回该单链表的结点总数。
。。。。。。
};
请编程实现单链表类的成员函数int Count ( );其功能见该函数的注解行。注意:所使用的额外空间只能为O(1),否则不得分。
班级姓名学号请在此书写第2小题的答案:
班级姓名学号
二、回答题(本题共3 题,共计25 分,1、3题7分,2 题11分)
1、请问:层数总数为L的完全二叉树的结点总数,最多为多少?最少为多少?为什
么?
2、对二叉树中结点进行按层次顺序的访问操作(从根结点开始,自上而下进行访问,每一层结点的访问顺序为自左至右)称为二叉树的层次遍历,遍历所得到的结点序列称为二叉树的层次序列。已知一棵二叉树的层次序列为A、B、C、D、E、F、G、H、I、J,中序序列为D、B、G、E、H、J、A、C、I、F,请画出该二叉树。
3、快速排序法和堆排序法,是二种常用的排序法。在平均情况下和最坏情况下,它们的时间复杂性级别分别为多少?它们所使用的额外空间的空间复杂性的级别呢?
班级姓名学号
三、填充题和选择题(本大题共 5 小题,每小题7 分)
1、设有如下的时间复杂性级别,请按级别从低到高的顺序排成一行。
O(3n
)、O(2
n
)、O(1)、O(n
1/2
)、O(log2n)、O(n
2
)、O(n
3
)、
答:
2、在一个单链表中,若要删除指针q所指结点的直接后继结点,则执行( )。注:next 指针场给出本结点的直接后继结点的地址。
A.p = q->next; q->next = p->next;delete p;
B.q->next=q->next;p=q->next;delete p;
C.q->next=q->next->next; p = q->next; delete p;
3、在一个双链表中,若要删除指针q所指的结点,则执行( )。注:prior和next 指针场给出本结点的直接前驱结点和直接后继结点的地址。
A.q->prior->next = q->next; q->next->prior = p->prior;delete q;
B.q->prior->next = q->next; delete q; q->next->prior = p->prior;
C.q->next->prior = p->prior;delete q; q->prior->next = q->next;
4、在有序表中,应用折半查找法成功地找到一个结点,在平均情况下的时间复杂性是[ ], 在最坏情况下的时间复杂性是[ ]。设结点个数为n,以大O形式给出时间复杂性。
5、在平衡二叉排序树上成功地找到一个结点,在平均情况下的时间复杂性是 [ ], 在最坏情况下的时间复杂性是 [ ]。设结点个数为 n,以大O形式给出时间复杂性