复旦大学考研计算机961真题答案针对回忆版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
17 18年两年答案
说一下:由于学校封题,所以只有回忆版,软工细节无法复现
所以我们只能尽量写出更多东西
2017年
第一部分数据结构
1.向量相对于数组有什么优缺点?
优点:
(1)可以动态增长长度
(2)数组在内存中分配的连续空间,多次分配释放后会有内存碎片,而vectors 是动态增长的,不是连续的,所以不会出现内存碎片,还有vector的迭代器能防止出现类似数组愈界等等。
(3)数组不允许拷贝和赋值,即不能将数组的内容拷贝到其他数组作为其初始值,但是vector可以。
缺点:
(1)在内部进行插入删除,效率较低。
(2)只能在末端进行pop和push。
(3) 当动态长度超过默认分配大小后,要整体重新分配、拷贝和施放。
2.二叉树计算叶子节点算法,时间复杂度。(可使用任一程序设计语言或伪代码,建议先用自然语言描述算法)。
答:主要思想:采用递归算法,先序遍历二叉树的每个结点,如果结点没有左子树和右子树,则叶子结点个数加1。
代码:
Int CountOfLeaf ( BiTree T) //求二叉树叶子结点个数
{
if(!T) return 0;
if (T->lchild==NULL&&T->rchild==NULL)
count++; //如果没有左右孩子,则为叶子结点
CountOfLeaf ( T->lchild); //遍历左子树
CountOfLeaf ( T->rchild);//遍历右子树
return count;
}
int main( BiTree T)
int count=0; //全局变量count表示叶子结点的个数
CountOfLeaf (T);//求二叉树叶子结点个数
return count;
}
时间复杂度为O(n)
2.几乎逆序的数组排序用什么排序算法?写出算法,时间复杂度。
答:前提条件:假定数组原始几乎从大到小排列,要将数组从小到大进行排列主要思想:先将数组先原地倒置,然后再将数组进行冒泡排序。
代码:
Void Reverse( int a[], n) //逆序函数,将数组中的元素原地倒置
{
for(i = 0; i < n/2 ;i++)
{
Swap(a[i],a[n - i - 1]);
}
}
void BubbleSort( int a[],int n) //冒泡排序
{