单选题
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.
B.
C.
D.
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. B. C. D.
2-18将下列由三棵树组成的森林转换为二叉树,正确的结果是(A)。
A. B. C. D.
2-19设有正文ADDBCBDCCBDCAD,字符集为A,B,C,D,设计一套二进制编码,使得上述正文的编码最短。正确的哈夫曼树(要求左孩子权值小于等于右孩子)以及编码是(D)。
A. A:010 B:011 C:1 D:00
B. A:011 B:111 C:01 D:0
C. A:00 B:01 C:0 D:1
D. A:00 B:01 C:10 D:11
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<iostream> 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:
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<iostream> 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<<Depth(tree); return 0; }
参考答案:
(1)T==NULL (2)m=Depth(T->lchild) (3)n=Depth(T->rchild)
5-3创建哈夫曼树
创建哈夫曼树。
#include<cstring> #include<iostream> 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<min1&&HT[i].parent==0) { s2=s1; min2=min1; min1=HT[i].weight; s1=i; } else if(HT[i].weight<min2&&HT[i].parent==0) { min2=HT[i].weight; s2=i; } } } void CreatHuffmanTree(HuffmanTree &HT,int n) { int m,s1,s2,i; if(n<=1) return; m=2*n-1; HT=new HTNode[m+1]; for(i=1;i<=m;++i) { HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for(i=1;i<=n;++i) cin >> 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
二叉树采用二叉链表存储结构,其定义为:
typedef struct BiTNode { char data; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode,*BiTree;
函数接口定义:
void InOrder(BiTree Tree)//中序遍历 void creat(BiTree &Tree)//构建二叉树
其中,
Tree
是用户传入的参数,为指向二叉树根节点的指针。裁判测试程序样例:
#include<stdio.h> #include<malloc.h> #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个。(提示:运算数均在叶子结点上,叶子结点数即为运算数个数)
函数接口定义:
BiTree Create(); /*按先序输入创建一棵二叉树,返回二叉树根节点指针。*/ int OperandCount(BiTree T); /*T是二叉树树根指针,函数OperandCount返回二叉树中操作数的个数,若树为空,则返回0。题目保证所给二叉树一定是正确的表达式。*/
裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> 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 _______________________________; //否则返回左右子树上叶子结点之和 } /* 请在这里填写答案 */
输入样例:
文章来源:https://www.toymoban.com/news/detail-766301.html
对于上图所示的二叉树,输入数据为扩展的先序序列:
+-A##*F##G##C##文章来源地址https://www.toymoban.com/news/detail-766301.html+-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);//否则返回左右子树上叶子结点之和 }
到了这里,关于数据结构第5章练习答案(PTA)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!