数据结构第5章练习答案(PTA)

单选题

2-1以下说法错误的是(A

A.树形结构的特点是一个结点可以有多个直接前趋

B.线性结构中的一个结点至多只有一个直接后继

C.树形结构可以表达(组织)更复杂的数据

D.树(及一切树形结构)是一种"分支层次"结构

E.任何只含一个结点的集合是一棵树

2-2利用二叉链表存储树,则根结点的右指针是(C

A.指向最左孩子

B.指向最右孩子

C.空

D.非空

2-3已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历的结果为(A

A.CBEFDA

B.FEDCBA

C.CBEDFA

D.不定

2-4下面几个符号串编码集合中,不是前缀编码的是(B

A.{0,10,110,1111}

B.{11,10,001,101,0001}

C.{00,010,0110,1000}

D.{b,c,aa,ac,aba,abb,abc}

2-5一棵有n个结点的二叉树,按层次从上到下,同一层从左到右顺序存储在一维数组A[1..n]中,则二叉树中第i个结点(i从1开始用上述方法编号)的右孩子在数组A中的位置是(D

A.A[2i](2i<=n)

B.A[2i+1](2i+1<=n)

C.A[i-2]

D.条件不充分,无法确定

2-6以下说法错误的是(C

A.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。

B.若一个二叉树的树叶是某子树的中序遍历序列中的第一个结点,则它必是该子树的后序遍历序列中的第一个结点。

C.已知二叉树的前序遍历和后序遍历序列并不能惟一地确定这棵树,因为不知道树的根结点是哪一个。

D.在前序遍历二叉树的序列中,任何结点的子树的所有结点都是直接跟在该结点的之后。

2-7在二叉树的二叉链表结构中,指针p所指结点为叶子结点的条件是(B

A.p=NULL

B.p->lchild==NULL && p->rchlid==NULL

C.p->lchild==NULL

D.p->rchlid==NULL

2-8深度为k的完全二叉树至少有(1)个结点,至多有(2)个结点。(D

A.(1)2k-1 (2)2k-1

B.(1)2k(2)2^{k}-1

C.(1)2^{k}(2)2^{k}+1

D.(1)2^{k-1}(2)2^{k}-1

2-9高度为8的完全二叉树至少有(C)个叶子结点。

A.128        B.63        C.64        D.32

2-10二叉树的先序序列和中序序列相同的条件是(B

A.任何结点至多只有左子女的二叉树

B.任何结点至多只有右子女的二叉树

C.右子树为空

D.左子树为空

2-11设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。与森林F对应的二叉树根结点的右子树上的结点个数是(D)。

A.M1        B.M1+M2        C.M3        D.M2+M3

2-12一棵完全二叉树上有1001个结点,其中叶子结点的个数是(D)。

A.250        B.500        C.254        D.501

2-13设给定权值总数有n 个,其哈夫曼树的结点总数为(D

A.不确定        B.2n        C.2n+1        D.2n-1

2-14一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有(B)结点。

A.2h        B.2h-1        C.2h+1        D.h+1

2-15在二叉树结点的先序序列,中序序列和后序序列中,所有叶子结点的先后顺序(B)。

A.都不相同

B.完全相同

C.先序和中序相同,而与后序不同

D.中序和后序相同,而与先序不同

2-16在完全二叉树中,若一个结点是叶结点,则它没(C)。

A.左子结点

B.右子结点

C.左子结点和右子结点

D.左子结点,右子结点和兄弟结点

2-17一个深度为k的,具有最少结点数的完全二叉树按层次,(同层次从左到右)用自然数依此对结点编号,则编号最小的叶子的序号是(B)。 

A.2^{k-2}        B.2^{k-2}+1        C.2^{k-1}+1        D.2^{k-1}

2-18将下列由三棵树组成的森林转换为二叉树,正确的结果是(A)。

数据结构第5章练习答案(PTA)_第1张图片

 A.数据结构第5章练习答案(PTA)_第2张图片        B.数据结构第5章练习答案(PTA)_第3张图片        C.数据结构第5章练习答案(PTA)_第4张图片        D.数据结构第5章练习答案(PTA)_第5张图片

2-19设有正文ADDBCBDCCBDCAD,字符集为A,B,C,D,设计一套二进制编码,使得上述正文的编码最短。正确的哈夫曼树(要求左孩子权值小于等于右孩子)以及编码是(D)。

A.  A:010 B:011 C:1 D:00

数据结构第5章练习答案(PTA)_第6张图片

B.  A:011 B:111 C:01 D:0

数据结构第5章练习答案(PTA)_第7张图片

 C.  A:00 B:01 C:0 D:1

数据结构第5章练习答案(PTA)_第8张图片

 D.  A:00 B:01 C:10 D:11

数据结构第5章练习答案(PTA)_第9张图片

2-20设F是一个森林,B是由F变换得的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有(C)个。

A.n−1        B.n        C.n+1        D.n+2

程序填空题

5-1计算二叉树中度为1的结点个数

统计二叉树度为1的结点个数。

#include
using namespace std;
typedef struct BiNode{                
    char data;
    struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;

void CreateBiTree(BiTree &T){    
    char ch;
    cin >> ch;
    if(ch=='#')  T=NULL;            
    else{                            
        T=new BiTNode;
        T->data=ch;                
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}

int NodeCount ( BiTree T)
{ 
 if(_______________2 分) return 0;
 if(T->lchild==NULL&&T->rchild!=NULL)
  return _______________2 分;
 if(T->lchild!=NULL&&T->rchild==NULL)
  return _______________3 分;
  ______________________3 分;
 }

int main(){
    BiTree T;
    CreateBiTree(T);
    printf("%d", NodeCount(T));
    return 0;
}

输入样例1:

数据结构第5章练习答案(PTA)_第10张图片

AB#DF##G##C##

输出样例1:

1

参考答案:

(1)T==NULL
(2)1+NodeCount(T->rchild)
(3)1+NodeCount(T->lchild)
(4)return NodeCount(T->rchild)+NodeCount(T->lchild)

5-2 计算二叉树深度

计算二叉树深度。

#include
using namespace std;

typedef struct BiNode
{                
    char data;                    
    struct BiNode *lchild,*rchild;    
}BiTNode,*BiTree;


void CreateBiTree(BiTree &T)
{    
    char ch;
    cin >> ch;
    if(ch=='#')  T=NULL;            
    else{                            
        T=new BiTNode;
        T->data=ch;                    
        CreateBiTree(T->lchild);    
        CreateBiTree(T->rchild);    
    }                                
}                                

int Depth(BiTree T)
{ 
    int m,n;
    if(___________________2 分) return 0;        
    else 
    {                            
        ___________________3 分;            
        ___________________3 分;            
        if(m>n) return(m+1);        
        else return (n+1);
    }
}

int main()
{
    BiTree tree;
    CreateBiTree(tree);
    cout<

参考答案:

(1)T==NULL
(2)m=Depth(T->lchild)
(3)n=Depth(T->rchild)

5-3创建哈夫曼树

创建哈夫曼树。

#include
#include
using namespace std; 

typedef struct
{    
    int weight;
    int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;


void Select(HuffmanTree HT,int len,int &s1,int &s2)
{
    int i,min1=32767,min2=32767;
    for(i=1;i<=len;i++)
    {
        if(HT[i].weight> HT[i].weight;
    for(i=n+1;i<=m;++i) 
    {      
        ___________________2 分;
        HT[s1].parent=________2 分;
        HT[s2].parent=________2 分;
        HT[i].lchild=_________2 分;    
        HT[i].rchild=_________2 分;                       
        HT[i].weight=___________________2 分;
    }                                            
}    


void print(HuffmanTree HT,int n)
{
    for(int i=1;i<=2*n-1;i++)
        cout << HT[i].weight << " " << HT[i].parent << " " << HT[i].lchild  << " " << HT[i].rchild << endl;
}


int main()
{
    HuffmanTree HT;
    int n;
    cin >> n;
    CreatHuffmanTree(HT,n);
    print(HT,n);
    return 0;
}

参考答案:

(1)Select(HT,i-1,s1,s2);
(2)i
(3)i
(4)s1
(5)s2
(6)HT[s1].weight + HT[s2].weight

函数题 

6-1 二叉树的遍历

输入二叉树的先序遍历序列,以#代表空树,输出该二叉树的中序遍历序列。例如,有如下二叉树,其先序序列为:ABC##DE#G##F###,输出其中序序列:CBEGDFA

数据结构第5章练习答案(PTA)_第11张图片

 二叉树采用二叉链表存储结构,其定义为:

typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild;
    struct BiTNode *rchild;
}BiTNode,*BiTree;

函数接口定义:

void InOrder(BiTree Tree)//中序遍历
void creat(BiTree &Tree)//构建二叉树

其中, Tree 是用户传入的参数,为指向二叉树根节点的指针。

裁判测试程序样例:

#include
#include
#define len sizeof(struct BiTNode )

typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild;
    struct BiTNode *rchild;
}BiTNode,*BiTree;
void InOrder(BiTree Tree);
 void creat(BiTree &Tree);
int main()
{
    BiTree Tree;
    creat(Tree);//创建二叉树
    InOrder(Tree);//中序遍历
    return 0;
}

/* 请在这里填写答案 */

输入样例:

ABC##DE#G##F###

输出样例:

CBEGDFA

参考答案:

void InOrder(BiTree Tree)
{
    if(Tree!= NULL)
    {
        InOrder(Tree->lchild);//先访问左结点
        printf("%c",Tree->data);
        InOrder(Tree->rchild);//最后访问右结点
    }
    return;
}
void creat(BiTree &Tree)
{
    char val;
    scanf("%c",&val);
    if(val=='#')
    {
        Tree=NULL;
        return;
    }
    Tree=(BiTNode *)malloc(sizeof(BiTNode));
    Tree->data=val;
    Tree->lchild=NULL;
    Tree->rchild=NULL;
    creat(Tree->lchild);
    creat(Tree->rchild);
}

 6-2 表达式中运算数计数(二叉树的遍历)

请编写程序,实现统计二叉树表示的表达式中操作数的个数。例如,下图表示:A-F*G+C,其中运算数共有4个。(提示:运算数均在叶子结点上,叶子结点数即为运算数个数)

数据结构第5章练习答案(PTA)_第12张图片

 函数接口定义:

BiTree Create();
/*按先序输入创建一棵二叉树,返回二叉树根节点指针。*/
int OperandCount(BiTree T);
/*T是二叉树树根指针,函数OperandCount返回二叉树中操作数的个数,若树为空,则返回0。题目保证所给二叉树一定是正确的表达式。*/

裁判测试程序样例:

#include 
#include 

typedef char ElemType;
typedef struct BiTNode
{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

BiTree Create();
int OperandCount ( BiTree T);

int main()
{
    BiTree T; 
    T = Create();    
    printf("%d\n", OperandCount(T));
    return 0;
}
/* 请根据下面提示,补充横线上的代码,并把两个函数的完整部分复制到答题框内 */
BiTree Create(){
    char ch;
    BiTree T;
    scanf("%c",&ch);   
    if(ch=='#') 
        ____________________________;//若输入字符为#,则该树为空
    else{
        T=(BiTree)malloc(sizeof(BiTNode));   //创建一个新结点T
        ____________________; //给新结点的数据域赋值                 
        T->lchild=Create();   
    __________________________;//创建右子树
    }
    return T;
}
int OperandCount(BiTree T){
    if(T==NULL) 
         ___________________; //若树为空则个数为0
    if(_______________________)//若根节点为叶子结点
          return 1;
    else 
        return _______________________________;  //否则返回左右子树上叶子结点之和
}

/* 请在这里填写答案 */

输入样例:

数据结构第5章练习答案(PTA)_第13张图片

对于上图所示的二叉树,输入数据为扩展的先序序列:
+-A##*F##G##C##

+-A##*F##G##C##

输出样例:

4

参考答案:

BiTree Create(){
    char ch;
    BiTree T;
    scanf("%c",&ch);
    if(ch=='#') T=NULL;
    else{
        T=(BiTree)malloc(sizeof(BiTNode));   //创建一个新结点T
        T->data=ch; //给新结点的数据域赋值                 
        T->lchild=Create();   
        T->rchild=Create();//创建右子树
    }
    return T;
}
int OperandCount(BiTree T){
    if(T==NULL) return 0; //若树为空则个数为0
    if(T->lchild==NULL and T->rchild==NULL) return 1;//若根节点为叶子结点
    else return OperandCount(T->lchild)+OperandCount(T->rchild);//否则返回左右子树上叶子结点之和
}

你可能感兴趣的:(数据结构练习,数据结构,c++,算法)