从概念上讲,树,森林和二叉树是三种不同的数据结构,将树,森林转化为二叉树的基本目的是什么,并指出树和二叉树的主要区别。
设L为单链表的头结点地址,其数据结点的数据都是正整数且无相同的,试设计利用直接插入的原则把该链表整理成数据递增的有序单链表的算法。
假定用两个一维数组L[N]和R[N]作为有N个结点1,2,…, N的二叉树的存储结构。L[i]和R[i]分别指示结点 i的左子女和右子女;L[i]=0(R[i]=0)表示i的左(右)子女为空。设计一个算法,由L和R建立一个一维数组T[n],使T[i]存放结点i的父亲;然后再写一个判别结点U是否为结点V的后代的算法。
设 head为一单链表的头指针,单链表的每个结点由一个整数域data和指针域next组成,整数在单链表中是无序的。编一函数,将 head链中结点分成一个奇数链和一个偶数链,分别由p,q指向,每个链中的数据按由小到大排列。程序中不得使用malloc申请空间。
使操作后的链表A中仅留下三个表中均包含的数据元素的结点,且没有值相同的结点,并释放所有无用结点。限定算法的时间复杂度为O(m+n+p),其中m、n和p分别为三个表的长度。
假设二叉排序树采用链表结构存储,设计一个算法,从大到小输出该二叉排序树中所有关键字不小于X的数据元素。
若线性表中各结点的查找概率不等,则可用如下策略提高顺序查找的效率∶若找到指定的结点,则将该结点和其前驱结点交换,使得经常被查找的结点尽量位于表的前端。试对线性表的链式存储结构写出实现上述策略的顺序查找算法(查找时必须从表头开始向后扫描)。
如果一个字符串的一个子串(其长度大于1)的各个字符均相同,则称之为等值子串。试设计一个算法,输入字符串s,以“!”作为结束标志。如果串s中不存在等值子串,则输出信息“无等值子串”,否则求出(输出)一个长度最大的等值子串。
一个仅由字母组成的字符串s,长度为n,其结构为单链表,每个结点的data字段只存放一个字母。试设计一个函数,去掉字符串中所有的X字母,并将串中的一个最小字母排列到串尾。
编程求以孩子兄弟表示法存储的森林的叶子结点数,要求描述结构。
已知树中结点数)
采用顺序存储结构存储的串,编写一个程序,将两个字符串进行比较,若s>t时返回1,s=t时返回0,s<t时返回-1。不能用strcmp库函数。
假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请设计一个算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即 A表和B表)的结点空间构造C表。
以数据集合{1,2,3,4,5,6}的不同序列为输入,构造4棵高度为4的二叉排序树。
求含有n个结点、采用顺序存储结构的完全二叉树中的序号最小的叶子结点的下标。要求写出简要步骤。
设一棵二叉树以二叉链表为存贮结构,设计一个算法将二叉树中所有结点的左,右子树相互交换。
mink和maxk是给定的两个参变量。它们的值可以和表中的元素相同,也可以不同)。
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试设计一个高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间。
直接在二叉排序树中查找关键码K与从中序遍历输出的有序序列中用二分查找法查找关键码K,其数据比较次数是否相同?
设顺序表va中的数据元素递增有序。试设计一个算法,将x插入到顺序表的适当位置上,以保持该表的有序性。
435612和13542 6,请说明为什么不能或如何才能得到。
熟悉图的存储结构,画出下面有向图的邻接矩阵、邻接表、逆邻接表、十字链表。写出邻接表表示的图从顶点A出发的深度优先遍历序列和广度优先遍历序列。
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试设计一个高效的算法,删除表中所有值大于 mink且小于 maxk的元素(若表中存在这样的元素),同时释放被删结点空间(注意:mink和maxk是给定的两个参变量。它们的值可以和表中的元素相同,也可以不同)。
假定一个待散列存储的线性表为(32,75,29,63,48,94,25,46,18,70),散列地址空间为HT[13],若采用除留余数法构造散列函数和线性探测法处理冲突,试求出每一元素的初始散列地址和最终散列地址,画出最后得到的散列表,求出平均查找长度。
采用顺序存储结构存储的串,编写一个程序,将两个字符串进行比较,若s>t时返回1,s=t时返回0,s<t时返回-1。不能用strcmp库函数。
若在内存中存放一个完全二叉树,在二叉树上只进行下面两个操作: (1)寻找某个结点双亲 ; (2)寻找某个结点的子女; 请问应该用何种结构来存储该二叉树?
已知一个森林的先序序列和后序序列如下,请构造出该森林。 先序序列:ABCDEFGHIJKLMNO 后序序列:CDEBFHIJGAMLONK
已知指针 ha和 hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试设计一个算法将这两个链表连接在一起(即令其中一个表的首元结点连在另一个表的最后一个结点之后),假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。
给定有m个整数的递增有序数组A[1..m]和有n个整数的递减有序数组B[1..n]。试写出算法:将数组A和B归并为递增有序数组C[1..m+n]。(要求:算法的时间复杂度为O(m+n)。)
试设计一个算法,在无头结点的动态单链表上实现线性表操作INSERT(L,i,b),并和在带头结点的动态单链表上实现相同操作的算法进行比较。
二叉树采用二叉链表存储 (1)编写计算整个二叉树高度的算法(二叉树的高度也叫二叉树的深度)。 (2)编写计算二叉树最大宽度的算法(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。
如果某个文件经内排序得到80个初始归并段,试问: (1)若使用多路归并执行3趟完成排序,那么应取的归并路数至少应为多少? (2)如果操作系统要求一个程序同时可用的输入/输出文件的总数不超过15个,则按多路归并至少需要几趟可以完成排序?如果限定这个趟数,可取的最低路数是多少?
设计一个算法,在中序全线索二叉树中,查找给定结点* p在中序序列中的后继(二叉树的根结点指针并未给出),并中序遍历该线索二叉树。
试构造对5个整数元素进行排序,最多只用7次比较的算法思想。
函数void insert(char*s,char*t,int pos)将字符串t插入到字符串s中,插入位置为pos。请用c语言实现该函数。假设分配给字符串s的空间足够让字符串t插入。(说明:不得使用任何库函数)
试将下列递归函数改写为非递归函数。 void test(int *sum) { int x; scanf("%d",&x); if(x==0) *sum=0 ; else {test(&sum); (*sum)+=x;} printf("%5d",*sum); }
设计一个算法,统计在输入字符串中各个不同字符出现的频度。(字符串中的合法字符为'A'-'Z'这26个字母和'0'-'9'这10个数字)。
设计一个深度优先遍历图的非递归算法。(图用邻接矩阵存储)
编写递归算法,对于二叉树中每一个元素值为X的结点,删去以它为根的子树,并释放相应的空间。
设有正文AADBAACACCDACACAAD,字符集为A,B,C,D,设计一套二进制编码,使得上述正文的编码最短。
利用Floyd算法求下图中各对顶点之间的路径。
对n个顶点的无向图G,采用邻接矩阵表示,如何判别下列有关问题: (1)图中有多少条边? (2)任意两个顶点i和j是否有边相连? (3)任意一个顶点的度是多少?
顺序查找时间为O(n),二分法查找时间为O(log2n),散列法为O(1),为什么有高效率的查找方法而低效率的方法不被放弃?
设有序表为(a,b,c,d, e,f,g,h, i,j,k,p,q),请分别画出对给定值a,g和n进行折半查找的过程。
设计一个算法,以求出给定二叉排序树中值为最大的结点。
简述顺序存储队列的假溢出的避免方法及队列满和空的条件。
设整数序列a1,a2,…,an,给出求解最大值的递归程序。
给定带权有向图G和源点v1,利用迪杰斯特拉(Dijkstra)算法求从v1到其余各顶点的最短路径。
试设计一个算法,对带头结点的单链表实现就地逆置。
已知顺序表A长度为n,试写出将监视哨设在高端的顺序查找算法。
设待排序的排序码序列为{12, 2, 16, 30, 28, 10, 16*, 20, 6, 18},试写出使用快速排序方法每趟排序后的结果。并说明做了多少次排序码比较。
输入一个由若干单词组成的文本行,每个单词之间用若干个空格隔开,统计其中的单词数。
试找出满足下列条件的二叉树: 1)先序序列与后序序列相同; 2)中序序列与后序序列相同; 3)先序序列与中序序列相同; 4)中序序列与层次序列相同;
拓扑排序的结果不是唯一的,试写出下图任意2个不同的拓扑序列。
名词解释:名词解释:栈和队列
设计一个递归算法,向以BT为树根的二叉排序树上插入值为x的结点。
设有一个二维数组A[m][n],假设A[0][0]存放位置在644,A[2][2]存放位置在676,每个元素占一个空间,问A[3][3]存放在什么