数据结构自考题

  1. 下面程序段的时间复杂度是 O(mn) 。
    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
    a[i][j]=0;
  2. 数据结构的三个方面:数据的 逻辑结构、物理结构、 运算。
    线性表 栈 队列=======
    线性表

    6.若长度为n的非空线性表采用顺序存储结构,删除表的第i个数据元素,首先需要移动表中数据元素的个数是(n-i)。
  3. 线性表的长度是指(表中的元素个数)。
  4. 若长度为n的非空线性表采用顺序存储结构,删除表的第i个数据元素,i的合法值应该是( C. 1≤i≤n)。
  5. 若某线性表中最常用的操作是取第i个元素和删除最后一个元素,则采用什么存储方式最节省时间(顺序表)。
  6. 带头结点的单链表head为空的判断条件是(head->next==NULL)。
    43.在一个单链表中,若删除(*p)结点的后继结点,则执行(p->next=p->next->next)。
  7. 若频繁地对线性表进行插入和删除操作,该线性表应该采用的存储结构是(链式)。
    53.若要在O(1) 的时间复杂度上实现两个循环链表头尾相接,则应对两个循环链表各设置一个指针,分别指向(各自的尾结点 )。
  8. 若长度为n的线性表采用顺序存储结构,在表的第i个位置插入一个数据元素,需要移动表中元素的个数是(n-i+1)。
  9. 若要在O(1)的时间复杂度上实现两个循环链表头尾相接,则应对两个循环链表各设置一个指针,分别指向( 各自的尾结点)。
  10. 将长度为m的单链表连接在长度为n的单链表之后的算法的时间复杂度为( O(n) )。
  11. 单链表中,增加头结点的目的是为了(方便运算的实现)。
  12. 在顺序表(n足够大)中进行顺序查找,其查找不成功的平均长度是(n+1 )。
    2222222222222222222222222222222222222
  13. 在 循环 链表中,从任何一结点出发都能访问到表中的所有结点。
  14. 每个结点只有 一个 链接域的链表叫做单链表。
    33333333333333333333333333333333333333333333333333

    11.线性表有两种存储结构:一是顺序表,二是链表。试问:如果有 n个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。在此情况下,应选用哪种存储结构? 为什么?
    答:选链式存储结构。它可动态申请内存空间,不受表长度(即表中元素个数)的影响,插入、删除时间复杂度为O(1)。
    12.试述顺序存储和链式存储的区别及各自的优缺点。
    答:数组占用连续的内存空间,链表不要求结点的空间连续。
    1)插入与删除操作:由于数组在插入与删除数据时需移动大量的数据元素,而链表只需要改变一些指针的链接,因此,链表比数组易于实现数据的插入和删除操作。
    2)内存空间的占用情况:因链表多了一个指针域,故较浪费空间,因此,在空间占用方面,数组优于链表。
    3)数据的存取操作:访问链表中的结点必须从表头开始,是顺序的存取方式,而数组元素的访问是通过数组下标来实现的,是随机存取方式,因此,在数据存取方面,数组优于链表。
    数据的合并与分离:链表优于数组,因为只需要改变指针的指向
    44444444444444444444444444444444444444444444444444444444

    1.写出计算单链表head(head为单链表的表头)中数据域data值为m的结点个数的算法。
    int count (Node *head)
    //计算单链表head中数据域data值为m的结点个数
    { Node *p=head->next;
    int n=0;
    while (p!=NULL)
    {if (p->datam)
    n++;
    p=p->next;
    }
    return n;
    }// count
    2.已知非空单链表head,试设计一个算法,交换p所指结点与其后继结点在链表中的位置。
    解答:
    int revers(listnode *head, listnode *p)
    /交换p所指结点与其后继结点在链表中的位置/
    { if (p->next
    NULL) return 0 ;
    listnode *q=head;
    while (q->next!=p) q=q->next;
    {r=p->next;q->next=r;
    p->next =r->next ; r->next=p;
    return 1;
    }// revers
    3.线性表用带头结点的单向链表示,试写出删除表中所有data域为零的元素的算法。
    解答:
    解:int DeleteItem(Node * head)
    { Node *p=head;
    //声明指针p,并令其指向链表头结点
    while (p->next!=NULL)
    {if(p->nex->data0)
    p->next=p->next->next.
    else p=p->next; //指针下移
    }
    }
    4.试设计一算法,计算带头结点的单链表head(head指向表头)的结点个数。
    解答:
    int Length( )
    //计算带表头结点的单链表head的长度
    {Node *p=head->next;
    int count=0;
    while (p!=NULL)
    {p=p->next; count ++;}
    return count;
    }
    5.判断单链表head(head指向表头) 是否是递增的。
    解答:【编者注: 链表无头结点】
    int order(Node *head)
    {Node *p=head;
    while(p->next!=NULL)
    if(p->datanext->data)
    p=p->next;
    else
    break;
    if(p->next
    NULL)
    return 1;
    else
    return 0;
    }
  15. 设计一个算法,在一个单链表head中找出值最小的元素。
    解答:【编者注: 链表无头结点】
    int Min(Node * head )
    //在单链表head中找出值最小的元素
    { Node *p=head;
    int min=p->data;
    while (p->next!=NULL)
    { if(p->next->data<min) min=p->next->data;
    p=p->next;
    }
    return min;
    }
    7设有两个单链表L和L1,其结点结构为(data,next),试编写算法判断链表L1中的各元素是否都是单链表L中的元素。
    解答:
    int SubLnk(Node *L, Node *L1)
    {Node *p1=L1;
    while(p1!=NULL)
    {Node *p=L;
    while((p!=NULL)&&(p1->data!=p->data))
    p=p->next;
    if (p==NULL) return 0; //【编者注:L1中元素未在L中】
    else p1=p1->next;
    }
    return 1;
    }
    9.设有一个正整数序列组成带头结点的单链表head,试编写算法确定在序列中比正整数x 大的数有几个。(8分)
    解答:
    int count(Node * head,int x)
    ∥在带头结点的单链表head中,确定序列中比正整数x大的数有几个
    {
    Node *p=head->next;
    int count=0;
    while (p!=NULL)
    { if (p->data>x) count ++;
    p=p->next;
    }
    return count;
    }∥算法count结束

    33333333333333333333333333333333333333333333333333333333333333333
  16. 对于栈操作数据的原则是(后进先出 )。
    13.对于栈操作数据的原则是(后进先出 )
  17. 设输入序列为A,B,C,D,借助一个栈不可以得到的输出序列是(D,A,B,C )。
    19.因此在初始为空的队列中插入元素a,b,c,d以后,紧接着作了两次删除操作,此时的队尾元素是 (d ).
  18. 一般情况下,将递归算法转换成等价的非递归算法应该设置(堆栈)。
  19. 设abcdef以所给的次序进栈,若在进栈操作时,允许退栈操作,则下面得不到的序列为( cabdef)。
  20. 因此在初始为空的队列中插入元素a,b,c,d以后,紧接着作了两次删除操作,此时的队尾元素是 (d )。
    41.栈和队列的主要区别在于(插入删除运算的限定不一样)
  21. 链栈和顺序栈相比,有一个较明显的优点是(通常不会出现栈满的情况)。
  22. 设一个栈的输入序列是 1,2,3,4,5,则下列序列中,是栈的合法输出序列的是(3 2 1 5 4)。
    72.单链表表示的链式队列的队头在链表的什么位置(链头 )。
    101.链栈和顺序栈相比,有一个较明显的优点是(通常不会出现栈满的情况 )。
  23. 设长度为n的链队列用单循环链表表示,若只设头指针,则入队操作的时间复杂度为(O(n) )。
  24. 设有三个元素X,Y,Z顺序进栈(进的过程中允许出栈),下列得不到的出栈排列是(ZXY )。
  25. 栈的插入和删除操作进行的位置在(栈顶)。
  26. 链栈和顺序栈相比,有一个较明显的优点是(通常不会出现栈满的情况)。
    2222222222222222222222222222222222222222222

    26循环队列的引入,目的是为了克服 假溢出 。
  27. 队列中允许进行插入的一端称为队尾。
    29.栈和队列的共同特点是插入和删除均在端点处进行。
    34.队列中允许进行插入的一端称为 队尾。
  28. 一个栈的输入序列是:1,2,3则不可能的栈输出序列是3 1 2。
  29. 设有一个顺序栈S,元素S1,S2,S3,S4,S5,S6依次进栈,如果6个元素的出栈顺序为S2,S3,S4,S6,S5,S1,则顺序栈的容量至少应为 3 。
    3333333333333333333333333333333333

    1.对于一个队列,如果输入项序列由1,2,3,4所组成,试给出全部可能的输出序列。
    答:1,2,3,4。
    4.将算术表达式a+b*(c+d/e)转为后缀表达式。
    答: B.abcde/+*+
  30. 将表达式((a+b)-c*(d+e)-f)(g+h)改写成后缀表达式。
    答:后缀表达式为:ab+cde+
    -f-gh+*
    14.将算术表达式a*(b+c)-d转为后缀表达式。
    答: abc+*d-
    19.写出中缀表达式A-(B+C/D)*E的后缀形式。
    答:中缀表达式A-(B+C/D)E的后缀形式是:ABCD/+E-。
    33333333333333333333333333333333333333333333333333333333333
  31. 一维数组A采用顺序存储结构,每个元素占用6个字节,第6个元素的起始地址为100,则该数组的首地址是(70)。
  32. 稀疏矩阵一般采用的压缩存储方法为(三元组表)。【编者注: 三元组表和十字链表】
  33. 设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( BA+180 )。
  34. 对稀疏矩阵进行压缩存储是为了(节省存储空间)。
  35. 二维数组A[5][6]的每个元素占5个单元,将其按行优先顺序存储在起始地址为3000的连续的内存单元中,则元素A[4][5]的存储地址为(3145)。




    串串串串串串串串串串串串

    2.串是(任意有限个字符构成的序列)。
    12.串是(任意有限个字符构成的序列 )。
  36. 串是(任意有限个字符构成的序列)。
  37. 若字符串“1234567”采用链式存储,假设每个字符占用1个字节,每个指针占用2个字节,则该字符串的存储密度为(33.3﹪)。




    ==============树树树树树树树树树==============
  38. 具有n个结点的二叉树采用链接结构存储,链表中存放NULL指针域的个数为(n+1)。
    3.在一棵二叉树的二叉链表中,空指针域数等于非空指针域数加( 2 )。
    4.某二叉树的前序和后序序列正好相反,则该二叉树一定是什么二叉树(高度等于其结点数)。
  39. 在非空二叉树的中序遍历序列中,二叉树的根结点的左边应该(只有左子树上的所有结点 )。
  40. 若一棵二叉树具有45个度为2的结点,6个度为1的结点,则度为0的结点个数是(46 )。
    10.某二叉树的前序和后序序列正好相同,则该二叉树一定是什么样的二叉树(空或只有一个结点)。
  41. 结点前序为xyz的不同二叉树,所具有的不同形态为 (5 )。
    17.在一棵高度为h(假定树根结点的层号为0)的完全二叉树中,所含结点个数不小于(2h )。
  42. 对于一棵满二叉树,m个树叶,n个结点,深度为h,则(n=2h+1-1 )。
    27.在一棵二叉树的二叉链表中,空指针域数等于非空指针域数加(2 )。
  43. 如果T2是由有序树T转换而来的二叉树,那么T中结点的先根序列就是T2中结点的(先根序列)。
  44. 对于一棵满二叉树,m个树叶,n个结点,深度为h,则(n=2h+1-1 )。
    38.深度为h且有多少个结点的二叉树称为满二叉树(2h+1-1 )。
    39.某二叉树的前序和后序序列正好相反,则该二叉树一定是的二叉树为(高度等于其结点数)。【编者注:只有一个叶子结点】
  45. 设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为(2h-1 )。【编者注: 根结点高度为1】
    44.在一棵具有n个结点的二叉树中,所有结点的空子树个数等于(n+1 )
    45.若一棵二叉树有11个度为2的结点,则该二叉树的叶结点的个数是(12 )。
    51.设森林F中有三棵树,第一、第二和第三棵的结点个数分别为m1,m2和m3,则森林F对应的二叉树根结点上的右子树上结点个数是 ( m2+m3 )。
  46. 二叉树的第I层上最多含有结点数为(2I )。【编者注: 根结点高度为0】
    55.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为( 2h-1 )。
    56.如果T2是由有序树T转换而来的二叉树,那么T中结点的先根序列就是T2中结点的(先根序列 )。
  47. 有n个叶子的哈夫曼树的结点总数为(2n-1 )。
  48. 若二叉树中度为2的结点有15个,度为1 的结点有10个,则叶子结点的个数为(16 )。
  49. 若某完全二叉树的深度为h,则该完全二叉树中具有的结点数至少是(2h-1 )。【编者注: 根结点高度为1】
  50. 任何一棵二叉树的叶结点在其先根、中根、后根遍历序列中的相对位置(肯定不发生变化)。
  51. 对于一棵满二叉树,m个树叶,n个结点,深度为h,则(n=2h+1-1) 【编者注: 根结点高度为0】
    75.某二叉树的前序和后序序列正好相同,则该二叉树一定是什么样的二叉树(空或只有一个结点)。
    76.在一棵具有n个结点的二叉树中,所有结点的空子树个数等于(n+1 )。
  52. 树中所有结点的度等于所有结点数加(-1 )。
    79.设二叉树根结点的层次为0,一棵高度为h 的满二叉树中的结点个数是(2h+1-1 )。
  53. 将一棵有50个结点的完全二叉树按层编号,则对编号为25的结点x,该结点(有左孩子,无右孩子)。
    83.设森林F中有三棵树,第一、第二和第三棵的结点个数分别为m1,m2和m3,则森林F对应的二叉树根结点上的右子树上结点个数是 (m2+m3 )。
  54. 用孩子兄弟链表表示一棵树,若要找到结点x的第5个孩子,只要先找到x的第一个孩子,然后(从兄弟域指针连续扫描4个结点即可)。
    90.深度为h的满二叉树具有的结点个数为(2h+1-1 )。【编者注: 根结点高度为0】
    96.在一棵高度为h(假定树根结点的层号为0)的完全二叉树中,所含结点个数不小于(2h )。
  55. 有n个叶子的哈夫曼树的结点总数为(2n-1 )。
  56. 若在一棵非空树中,某结点A有3个兄弟结点(包括A自身),B是A的双亲结点,则B的度为(3)。
  57. 深度为h的满二叉树所具有的结点个数是(2h+1-1 )。
    109.按照二叉树的定义,具有3个结点的二叉树有多少种(5 )。
    111.树中所有结点的度等于所有结点数加(-1 )。
  58. 树中所有结点的度等于所有结点数加( -1 )
  59. 树形结构的特点是:一个结点可以有 ( 多个直接后继)。
  60. 按照二叉树的定义,具有3个结点的二叉树具有的种类为(5 )。
  61. 结点前序为xyz的不同二叉树,所具有的不同形态为(5 )。
  62. 若一棵二叉树具有20个度为2的结点,6个度为1的结点,则度为0的结点个数是(21 )。
  63. 一棵线索二叉树的线索个数比链接个数多( 2 )个。
  64. 某二叉树的前序和后序序列正好相同,则该二叉树一定是的二叉树为(空或只有一个结点)。
  65. 设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1 则T中的叶子数为( 8 )。
    【编者注: 公式为

    22222222222222222222222222222222222222222222222222222222
  66. 若一棵二叉树有10个叶结点,则该二叉树中度为2的结点个数为 9。
    3.对于一棵二叉树,设叶子结点数为n0,次数为2的结点数为n2,则n0和n2的关系是n0= n2+1。
    6.深度为h且有2h-1个结点的二叉树称为满二叉树。(设根结点处在第1层)。
    8.哈夫曼树是带权路径长度最小 的二叉树。
  67. 二叉树的存储结构有顺序存储结构和链式存储结构。
  68. 哈夫曼树是 带权路径长度最小 的二叉树。
    11.一般树的存储结构有双亲表示法、孩子兄弟表示法和孩子链表表示法。
  69. 由一棵二叉树的后序序列和中序序列可唯一确定这棵二叉树 。
  70. 若二叉树的一个叶子结点是某子树的中根遍历序列中的第一个结点,则它必是该子树的后根遍历中的第一 个结点。
    22.具有100个结点的完全二叉树的叶子结点数为 50。
    25.将一棵树转换成一棵二叉树后,二叉树根结点没有右子树。
  71. 二叉树的遍历方式有三种:先序遍历、中序遍历、后序遍历。
  72. 若一棵二叉树有15个叶结点,则该二叉树中度为2的结的点个数为14。
  73. 则高度为k的二叉树具有的结点数目,最少为k,最多为2k-1。【编者注: 根结点高度为1】
  74. 对于一棵二叉树,设叶子结点数为n0,次数为2的结点数为n2,则n0和n2的关系是 n0= n2+1
  75. 设某二叉树的后序遍历序列为ABKCBPM,则可知该二叉树的根为 M 。
  76. 由一棵二叉树的后序序列和中序序列 可唯一确定这棵二叉树。
    3333333333333333333333333333333333333333333333333333
  77. 已知一棵二叉树的中序和前序序列如下,求该二叉树的后序序列。
    中序序列:c,b,d,e,a,g,i,h,j,f
    前序序列:a,b,c,d,e,f,g,h,i,j
    答:该二叉树的后序序列为:c,e,d,b,i,j,h,g,f,a
  78. 为什么说树是一种非线性结构?
    答:树中的每个结点除了根结点外,其余每个结点有一个直接前驱,但有多个直接后继,所以说树是一种非线性结构。
  79. 找出所有这样的二叉树形,其结点在先根次序遍历和中根次序遍历下的排列是一样的。
    答: 为空树,或为任一结点至多只有右子树的二叉树。
  80. 完全二叉树用什么数据结构实现最合适,为什么?
    答:完全二叉树用一维数组实现最合适。因为完全二叉树保存在一维数组中时,数组内没有空洞,不存在空间浪费问题;另外,顺序存储方式下,父子结点之间的关系可用公式描述,即已知父(或子)结点寻找子(或父)结点只需计算一个公式,访问结点方便。但采用链表存储时就存在空间浪费问题,因为每个结点要另外保存两个链接域,并且寻找结点也不容易。
    20. 为什么用二叉树表示一般树?
    答:树的最直观表示是为树中结点设置指向子结点的指针域,对k叉树而言,每个结点除data域外,还有k个链接域。这样,对一个有n个结点的k叉树来说,共有n*k个指针域,其中n-1个不空,另外n(k-1)+1个指针域为空,因此,空链接域的比例约为(k-1)/k ,于是导致大量的空间浪费。然而,如果采用二叉树表示一棵n个结点的树,则树中共有2n个链接域,其中未用到的有n+1个,占所有指针域的比例约为1/2,空间浪费少很多。
    另外,因为任何树型结构都可以转换成二叉树,因此,通常用二叉树表示树型结构。
    22.试找出前序序列和中序序列相同的所有二叉树。
    解答:空树或缺左子树的单支树。
    23.完全二叉树用什么数据结构实现最合适,为什么?
    答:完全二叉树用一维数组实现最合适。因为完全二叉树保存在一维数组中时,数组内没有空洞,不存在空间浪费问题;另外,顺序存储方式下,父子结点之间的关系可用公式描述,即已知父(或子)结点寻找子(或父)结点只需计算一个公式,访问结点方便。但采用链表存储时就存在空间浪费问题,因为每个结点要另外保存两个链接域,并且寻找结点也不容易。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值