单项选择题(2016年春程序员软考)

对二叉树中的结点如下编号:树根结点编号为1,根的左孩子结点编号为2、右孩子结点编号为3,以此类推,对于编号为i的结点,其左孩子编号为2i、右孩子编号为2i+1。例如,下图所示二又树中有6个结点,结点a、b、c、d、e、f的编号分别为1、2、3、5、7、11。那么,当结点数为n(n>0)的【 】时,其最后一个结点编号为2n-1。

A、二叉树为满二叉树(即每层的结点数达到最大值)

B、二叉树中每个内部结点都有两个孩子

C、二叉树中每个内部结点都只有左孩子

D、二又树中每个内部结点都只有右孩子

参考答案

关键词

二叉树;内部;结点;编号;算法;孩子;数据结构;树根;根结;

队列采用如下图所示的循环单链表表示,左图表示队列为空,右图为e1、e2、e3依次入队列后的状态,其中,rear指针指向队尾元素所在结点,size为队列长度。以下叙述中,正确的是【 】。

设有初始为空的栈S,对于入栈序列a、b、c、d,经由一个合法的进栈和出栈操作序列后(每个元素进栈、出栈各1次),以c作为第一个出栈的元素时,不能得到的序列为【 】。

对于长度为n的线性表(即n个元素构成的序列),若采用顺序存储结构(数组存储),则在等概率下,删除一个元素平均需要移动的元素数为【 】。

递归函数执行时,其调用和返回控制是利用【 】来进行的。

与算术表达式3-(2+7)/4对应的二又树为【 】。

在待排序的一组关键码序列k1,k2,…,kn中,若ki和kj相同,且在排序前ki领先于kj,那么排序后,如果ki和kj的相对次序保持不变,ki仍领先于kj,则称此类排序为稳定的。若在排序后的序列中有可能出现kj领先于ki的情形,则称此类排序为不稳定的。【 】是稳定的排序方法。

若待排序记录按关键字基本有序,则宜采用的排序方法是【 】。

【 】不符合二叉排序树的定义。

某有向图G及其邻接矩阵如下所示。以下关于图的邻接矩阵存储的叙述中,错误的是【 】。

最优二叉树(或哈夫曼树)是指权值为w1,w2,…,wn的n个叶结点的二叉树中带权路径长度最小的二叉树。【 】是哈夫曼树(叶结点中的数字为其权值)。

阅读以下说明和C函数,填补代码中的空缺(1)~(6)。二叉树的宽度定义为含有结点数最多的那一层上的结点数。函数 GetWidth()用于求二叉树的宽度。其思路是根据树的高度设置一个数组 counter[], counter[i]存放第i层上的结点数,并按照层次顺序来遍历二又树中的结点,在此过程中可获得每个结点的层次值,最后从counter[]中取出最大的元素就是树的宽度。按照层次顺序遍历二叉树的实现方法是借助一个队列,按访问结点的先后顺序来记录结点,离根结点越近的结点越先进入队列,具体处理过程为:先令根结点及其层次号(为1)进入初始为空的队列,然后在队列非空的情况下,取出队头所指示的结点及其层次号,然后将该结点的左子树根结点及层次号入队列(若左子树存在),其次将该结点的右子树根结点及层次号入队列(若右子树存在),然后再取队头,重复该过程直至完成遍历。设二叉树采用二叉链表存储,结点类型定义如下:typedef struct BTNode{ TElemType data; struct BTNode *left, *right;}BTNode, *BiTree;队列元素的类型定义如下:typedef struct{ BTNode *ptr; int LevelNumber;}QElemType;Get Width()函数中用到的函数原型如下所述,队列的类型名为 QUEUE:InitQueue(QUEUE *Q):初始化一个空队列,成功时返回值为1,否则返回值0isEmpty(QUEUE Q):判断队列是否为空,是空则为1,否则为0EnQueue( QUEUE*Q, QElemType a):将元素a加入队列,成功返回值为1,否则返回值0DeQueue(QUEUE *Q, QElemType *):删除队头元素,并通过参数带回其值,成功则返回值1,否则返回值0GetHeight (BiTree root):返回值为二叉树的高度(即层次数,空二叉树的高度为0)int Getwidth(BiTree root){ QUEUE Q; QElemType a, b; int width,height= GetHeight(root); int i, *counter =(int *)calloc(height+1, sizeof (int)); if(__(1)__) return -1;/*申请空间失败*/ if(! root) return 0;/*空树的宽度为0*/ if(__(2)__) return -1;/*初始化队列失败时返回*/ a.ptr= root; a.LevelNumber=1; if(! EnQueue(&Q,a)) return -1;/*元素入队列操作失败时返回*/ while (! isEmpty(Q)){ if(__(3)__)return -1;/*出队列操作失败时返回*/ counter[b. LevelNumber]++;/*对层号为b. LevelNumber的结点计数*/ if(b.ptr->left){/*若左子树存在,则左子树根结点及其层次号入队*/ a.ptr= b.ptr->left; a.LevelNumber=__(4)__; if(!EnQueue(&Q,a)) return -1; } if(b.ptr-> right){/*若右子树存在,则右子树根结点及其层次号入队*/ a.ptr= b.ptr->right; a. LevelNumber=__(5)__; if(! EnQueue(&Q,a)) return -1; } } width= counter[1]; for(i=1; i< height +1; 1++)/*求 counter[]中的最大值*/ if(__(6)__)width= counter [i]; free(counter); return width;}

已知某二叉树的先序遍历序列为ABCD,后序遍历序列为CDBA,则该二叉树为【 】。

在数据结构中,【 】是与存储结构无关的术语。

完全二叉树的特点是叶子结点分布在最后两层,且除最后一层之外,其他层的结点数都达到最大值,那么25个结点的完全二叉树的高度(即层数)为【 】。

二叉树中,具有两个子女的结点的中序后继结点最多只能有一个子女。

二叉树在线索化后,仍不能有效求解的问题是【 】。

线索二叉树是一种【 】结构。

求具有最小带权路径长度的二叉树的算法称为__________算法。对于给出的一组权W={10,12,16,21,30},通过该算法示出的二叉树的带权路径长度为__________。

如果一棵huffman树T有n0个叶子结点,那么,树T有多少个结点?要求给出求解过程。

在叶子数目和权值相同的所有二叉树中,最优二叉树一定是完全二叉树,该说法【 】。