2017年某高校848数据结构真题复习

  1. 数据是对客观事物的符号表示

  2. 元素之间的关系不同,通常由四类基本结构————集合,线性结构,树形结构,图状结构

  3. 算法的五个特性——出入确可穷

     1个或多个输出
     0个或多个输入
     确定性
     可行性
     有穷性
    
  4. 求下列程序段的时间复杂度

     for(i=1;i<=n;i++)
     	for(j=1;j<=n;j++)
     	{
     		C[i][j]=0;
     		for(k=1;k<=n;k++)
     			C[i][j]+=a[i][k]*B[k][j]	
     	}	
    

我的理解:外圈有效循环n次,中圈执行n次,内圈执行n次,就是O(n^3)

  1. 在长度为n的顺序表的第i个元素a之前插入一个元素,需要移动n-i+1个元素

  2. 在长度为n的顺序表中插入一个元素,平均移动n/2个元素

  3. 入栈顺序位abcdefg,出栈第一个元素是g,则出栈第五个元素是?

     我的理解:
     g第一个出来,那abcdef也就都进去了,
     所以第五个出来的只能是c
    
  4. 深度为10的满二叉树,有几个节点

     (2^10)-1
    
  5. 二叉树中有100个度为2的节点,则该二叉树有几个叶子节点

     性质3,叶子节点=度为2的节点数+1=101
    
  6. 无向图有20个顶点,当有多少条边时,称为完全无向图

    我的理解:完全无向图:该图中每条边都没有方向,任意两个顶点间都存在边 ,三个顶点,第一个顶点射出两条边,第二个顶点射出一条边,所以20个顶点就是1+2+3+4+5+…+19=190

  7. 不稳定的排序:快希选堆

  8. 稳定的排序:冒泡,插入,排序

  9. 循环队列的最大长度为6,队列中已有3个元素,对头元素是a,队尾元素是c,依次进行三个步骤,d入队,e入队,一个元素出队。求front,rear下标
    请添加图片描述
    我的理解:循环队列,入队是rear+1,出队是front+1
    d入队,e入队,队列的r+2到1了,一个元素出队f+1到3

  10. 二叉树的后序遍历为DCBFJIHGEA,中序为BCDAFEHJIG,画出二叉树求先序
    我的理解:根据后序遍历得到A为根,看A在中序哪里,是不是在中间,就说明,根的左边有BCD,根的右边有FEHJIG。再看后序遍历的,后序遍历的是从右向左看噢,所以看完了根,再看E,中序里E再A的左边,也就是说E是A的右孩子,记住先看根节点是谁,怎么看根节点是谁呢,先序的第一个元素就是根节点,因为先序遍历时是根左右嘛,后序遍历的最后一个节点是根节点,因为后序遍历的是左右根。找到根节点是谁之后,根据中序遍历看看其他节点大致的分布在根节点的两边,再根据先序从左往右,后序从右往左的一个一个找元素,找到一个元素拿到中序里看他在父节点的哪边。再写出他的先序遍历,先序是根左右,ABCDEFGHIJ请添加图片描述

  11. 关键字序列为12,25,36,80,66,72构造二叉排序树,求平均查找长度
    我的理解:第一个关键字为根,大于他的为右孩子,小于它的为左孩子,画出来就行了,平均查找长度,关键字分布的层数相乘 (1+2+3+4+5+6)/6=21/6=3.5
    请添加图片描述

  12. 12,8,6,20,36,25,5画出哈夫曼树,求带权路径长度
    我的理解:每次选最小的两个数相加加完后,整理一下树,再看每个叶子节点的权长,最后相加,权就是边嘛,全部相加就是[(20+25+36)x2+12x3+8x4+(5+6)x5]/7=285/7
    请添加图片描述
    16.无向图的邻接表请添加图片描述
    E到1,2,3,4,5然后为空,1,2,3,4,5分别表示ABCDF,这么画就ok了
    求A的度,就是看A有几条边呗,A的度为2,以B出发求深度优先,B-A-E-F-C-D,深度优先就是一条路走到低,到低了再返回上一步,举个例子,B先到的A,再就从A开始走,A走到E,E可以随便走一个没有走过的,比如E-F,F再走C,C下一步没有未被访问的点了,就回退到F,再退到E,E发现D没被访问,于是就去访问D。书顺序就是B-A-E-F-C-D。广度优先呢,举个例子,E的广度优先搜索就是E-A-B-F-C-D也可以是E-D-C-F-B-A还几种都可以的,那B的广度优先搜索遍历呢B-A-E,B到了A,E,E可以到-F-C-D。所以结果可以是B-A-E-F-C-D

  13. 直接插入排序
    我的理解:直接插入排序是从第二个数开始,依次和前面的数比较,前面的数如果大于它,前面的数就后移,这就是大概思路

     int sort(int A[],int length)
     {
     	int i,j,temp;
     	for(i=1;i<length;i++) #这里的i表示下标
     	{	
     		temp=A[i];
     		for(j=i-1;j>=0&&A[j]>A[I];j--)
     		{
     				A[j+1]=A[j]; 
     				#前面存在一个大于A[i]的数就把大于A[i]的数后移
     				#不用担心是否存在这样一种情况 9,2,3 
     				#A[i]为3,2小于3,则不动,j--,A[j]=9,9>3就要后移
     				#注意哈,不存在以上这种情况,9,2早就被循环给调正了,
    		}
    		A[j+1]=temp;
    		#假如是1,2,3这种情况
    		#A[i]=2,A[j]=1,1不小于2,所以j不--,跳出循环,再执行A[j+1]=temp,还是把2赋值给了2,也没有影响噢。
    	}
     }
    
  14. 简单选择排序
    我的理解:从第一个数开始,与自己和其他数比较,存在一个小于自己的数时,记住他的下标,再从该下标往后找一个小于该下标的数,记住新的小数的下标,直到找到结尾,找到结尾以后,就找到了最小的数的下标,利用temp与一个数交换位置,最小的数就去了头。再从第二个数开始,与自己和其他数比较,一旦找到一个小于自己的数,就记住他的下标,从该下标往后找一个更小的数,又记住更小的数的下标直到找到尾巴。再利用temp把最小的数放在第二个位置。再从第3个数开始…

    int select(int A[],int length)
    {
    	int i,j,temp,min;
    	for(i=0;j<length;i++)
    	{
    		min=i;
    		for(j=i;j<=length&&A[j]<A[min];j++)
    		{	
    			min=j;
    		}
    		temp=A[i];
    		A[i]=A[min];
    		A[min]=temp;
    	} 
    }
    
  15. 输出1000以内的质数
    我的理解:用一个for循环去让n除2到n-1,等于==0就不是

    int prime(int n) #传入一个n进来
    {
    	int j;
    	for(j=2;j<n;i++)
    		if(n%j==0)
    			return 0;
    	return 1;
    }
    int main()
    {
    	int i,a=0;
    	for(i=2;i<1001;i++)
    	{
    		if(prime(i))
    		{	
    			printf(“%d”,i);
    			a++;
    			if(a%10==0&&a!=0)
    				printf(“/n”);
    		}
    	}
    }
    

我的理解:传入一个n到prime,就需要j从2开始到n-1,n一个一个除,需要从2除到n-1都不为0,则n为质数,当n为质数时prime返回1,if真,执行:打印i,且a++,a加到10或者20,30之类的,就打印一个换行符,

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值