1、工大数据结构第三章作业数据结构与算法上机作业第三章树一、选择题1、在一棵树中,如果结点 A 有 3 个兄弟, B 是 A 的双亲,则 B 的度为 DA. 1 B. 2 C. 3 D. 42、深度为 h 的完全二叉树至少有 D 个结点,至多有 B 个结点A. 2h B. 2h-1 C. 2h+1 D. 2h-12(h-1) -1 +1=2(h-1)前(n-1)层满,第 h 层只有一结点3、具有 n 个结点的满二叉树有 C 个叶结点。A. n/2 B. (n-1)/2 C. (n+1)/2 D. n/2+1因为二叉树中,有这样一个性质,如果其终端结点数(也就是叶子节点)的个数 为 n1,度为 2
2、的结点数为 n2,则 n1=n2+1;假设叶子节点有 x 个,则度为 2 的个数为 x-1:所以: 2x-1 = n; 所以 x = (n+1)/2 ( 满二叉树)所以叶子节点个数为: (n+1)/2非终端结点为: (n+1)/2-14、一棵具有 25 个叶结点的完全二叉树最多有 B 个结点。A. 48 B. 49 C. 50 D. 515、已知二叉树的先根遍历序列是 ABCDEF ,中根遍历序列是 CBAEDF ,则后根遍历序列是A 。A. CBEFDA B. FEDCBA C. CBEDFA D. 不定6、具有 10 个叶结点的二叉树中有 B 个度为 2 的结点。A. 8 B. 9 C.
3、10 D. 117、一棵非空二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足 C 。A. 所有非叶结点均无左孩子 B. 所有非叶结点均无右孩子C. 只有一个叶子结点 D. A 和 B 同时成立8、在线索二叉树中, t 所指结点没有左子树的充要条件是 B。A. t-left=NULL B. t-ltag=TRUEC. t-ltag=TRUE 且 t-left=NULL D. 以上都不对9、n 个结点的 线索 二叉树上含有的线索数为 C。A. 2n B. n-1 C. n+1 D. nn-1 表示结点的左右子树,其余 n-1 指针为空线索取代原来的空链10、二叉树按照某种顺序线索化后
4、, 任一结点都有指向其前驱和后继的线索, 这种说法 B 。A. 正确 B. 错误 C. 不确定 D. 都有可能11、具有 n(n1)个结点的完全二叉树中,结点 i(2in) 的左孩子结点是 D。A. 2i B. 2i+1 C. 2i-1 D. 不存在12、具有 64 个结点的完全二叉树的深度为 C 。A. 5 B. 6 C.7 D. 813、将一颗有 100 个结点的完全二叉树从上到下、 从左到右一次对结点进行编号, 根结点的编号为 1,则编号为 45 的结点的右孩子的编号为 C。A. 46 B. 47 C. 90 D. 912i 举个简单的例子就可以看出来,比如 7 个节点时(也就是三层时)
5、,编号为 1 的左子树编号是 2,编号 2 的左子树是 4,编号 3 的左子树编号为 6。以此就可以看出来。左结点是 2i, 右结点才是 2i+114、在结点数为 n 的堆中插入一个结点时,复杂度为 C。A. O(n) B. O(n2) C. O(log 2n) D. O(log n2)15、两个二叉树是等价的,则它们满足 D。A. 它们都为空 B. 它们的左右子树都具有相同的结构C. 它们对应的结点包含相同的信息 D. A、B 和 C16、包含 n 个元素的堆的高度为 C 。(符号 a 表示取不小 a 最小整数)A. n B. log2n C. log2(n+1) D. n+117、以下说法
6、错误的是 B。A. 存在这样的二叉树,对其采用任何次序的遍历其结点访问序列均相同B. 二叉树是树的特殊情形C. 由树转换成二叉树,其根结点的右子树总是空的D. 在二叉树中只有一棵子树的情形下,也要指出是左子树还是右子树18、设 F 是一个森林, B 是由 F 变换得到的二叉树。若 F 中有 n 个非终端结点,则 B 中没有右孩子的结点有 C 个。A. n-1 B. n C. n+1 D. n+219、将一棵树 T 转换为二叉树 B,则 T 的后根序列是 B 的 B。A. 先根序列 B. 中根序列 C. 后根序列 D. 层次序列20、将一棵树转换为二叉树后,这颗二叉树的形态是 A 。A. 唯一的
7、,根结点没有左孩子 B. 唯一的,根结点没有右孩子C. 有多种,根结点都没有左孩子 D. 有多种,根结点都没有右孩子树转换成二叉树, 根节点是没有右孩子的, 这由转换规则应该不难理解, 且转换规则是唯一的,所以转换成的二叉树是唯一的21、设树 T 的度为 4,其中度为 1, 2, 3, 4 的结点个数分别为 4, 2, 1, 1,则 T 中的叶结点的个数为 D 。A. 5 B. 6 C. 7 D. 822、设森林 F 中有三棵树,第一、第二、第三棵树的结点个数分别为 M1, M2, M3 。与森林F 对应的二叉树根结点的右子树上的结点个数为 D。A. M1-1 B. M1+M2 C. M2 D
8、. M2+M323、若以二叉树的任一结点出发到根的路径上所经过的结点序列按其关键字有序, 则该二叉树是 C。A. 二叉排序树 B. 哈夫曼树 C. 堆 D. 线索二叉树24、用 5 个权值 3, 2, 4, 5, 1 构造的哈夫曼树的带权路径长度是 B 。A. 32 B. 33 C. 34 D. 15二、填空题1、一棵二叉树有 67 个结点,结点的度是 0 和 2。问这棵二叉树中度为 2 的结点有 33 个。2、含 A, B, C 三个结点的不同形态的二叉树有 5 棵。3、含有 4 个度为 2 的结点和 5 个叶子结点的完全二叉树,有 1 或 0 个度为 1 的结点。4、具有 100 个结点的
9、完全二叉树的叶子结点数为 50。5、在用左右链表示的具有 n 个结点的二叉树中,共有 2n 个指针域,其中 n-1 个指针域用于指向其左右孩子,剩下的 n+1 个指针域是空的。6、如果一颗完全二叉树的任意一个非终结结点的元素都 不小于 其左儿子结点和右儿子结点(如果有的话 )的元素,则称此完全二叉树为最大堆。7、堆是一种特殊形式的 完全 二叉树,对于最大堆而言,其根结点的元素的值应该是所有结点元素中 最大 的。8、二叉树的复制是指按照一棵已知的二叉树复制一个副本,使两者 等价 。复制二叉树最长用的方法是 后根遍历递归算法 。9、在定义堆时, 通常采用 结构体 方式定义相应的二叉树, 这样可以很
10、容易实现其相关操作。10、在构建选择树时, 根据孩子结点的获胜者确定他们双亲结点所得到的选择树称为 胜者树 。根据孩子结点的失败者确定他们双亲结点所得到的选择树称为 败者树 。11、树的表示方法包括 数组 、邻接表 和 左右链 。12 、表 达 式 (a+b*(c-d)-e/f 的 波兰 式( 前 缀式 ) 是 -+a*b-cd/ef ,逆 波 兰式 ( 后缀 式 ) 是abcd-*+ef/- 。13、设 F 是由 T1、T2、T3 三棵树组成的森林,与 F 对应的二叉树为 B。已知 T1, T2, T3 的结点数分别为 n1, n2 和 n3,则二叉树 B 的左子树中有 n1-1 个结点,
11、二叉树 B 的右子树中有n2+n3 个结点。14、设二叉树的中根序列为 ABCDEFG ,后根序列为 BDCAFGE 。则该二叉树的先根序列为EACBDGF 。该二叉树对应的森林中包含 2 棵树。15、先根次序遍历森林等同于按 先根 遍历对应的二叉树, 后根次序遍历森林等同与按 中根遍历对应的二叉树。16、一棵哈夫曼树有 19 个结点,则其叶子结点的个数为 10。17、设有数据 WG=7, 19, 2, 6, 32, 3, 21, 10 叶节点权重集合,则所构建哈夫曼树的高是 5 ,带权路径长度 WPL 为 169 。18、设有一份电文中共使用 6 个字符 a, b, c, d, e, f ,
12、其中出现频率依次为 2,3,4,7,8,19,则字符 c 的哈夫曼编码是 001,电文编码的总长度为 80 。20、在有 n 个结点的哈夫曼树中,叶子结点总数为 (n+1)/2 ,非叶结点的总数为 (n-1)/2 。三、试分别画出具有 4 个结点的二叉树的所有不同形态。四、已知一棵二叉树的中根序列和后根序列分别是 BDCEAHFG 和 DECBHGFA ,请画出此二叉树。五、已知非空二叉树 T,写一个算法,求度为 2 的结点的个数。要求:1、定义二叉树的抽象数据类型和型 BTREE ,并定义基本操作。2、编写函数 count2(BTREE T) ,返回度为 2 的节点的个数。3、在主函数中,构
13、建一个二叉树,并验证所编写的算法。六、用递归方法写一个算法,求二叉树的叶子结点数 int leafnum(BTREE T) 。要求:1、 定义二叉树的抽象数据类型和型 BTREE ,并定义基本操作。2、 编写函数 leafnum(BTREE T) ,返回树 T 的叶子节点的个数。在主函数中,构建一个二叉树,并验证所编写的算法。七、画出下图所表示的二叉树的中序线索二叉树和先序线索二叉树。八、已知二叉树的先根序列是 AEFBGCDHIKJ ,中根序列是 EFAGBCHKIJD ,画出此二叉树,并画出后序线索二叉树。九、在中序线索二叉树中插入一个结点 Q 作为树中某个结点 P 的左孩子,试给出相应的
14、算法。要求:1、 定义中序线索二叉树的型 THTREE 以及基本操作。2、 定义函数 void LInsert(THTREE P, THTREE Q); 实现题目要求的操作。在主函数中, 利用操作 RInsert 和 LInsert 构造一个线索二叉树, 并中序输出二叉树的结点的元素,验证结果。#include#include#include#include#includeusing namespace std;typedef int elementtype;struct node/ 节点的型node* lchild;node* rchild;bool ltag;bool rtag;eleme
15、nttype element;typedef node* head;/ 指向树根 roottypedef node* tree;/ 指向线索树的根节点void makeNull(head& h)/ 将线索二叉树置空h-lchild=h;h-ltag=false;h-rchild=h;h-rtag=true;head pointTotree(head& h,tree& t)/ 令 head 指向 tree,注意 head 指向的并不是根节点, tree 指向根节点h-lchild=t;h-rchild=h;h-ltag=true;h-rtag=true;return h;/中根遍历的下一个节点n
16、ode* inNext(node* p)node* q=p-rchild;if(p-rtag=true)/ 如果有右子树,找出右子树的最左节点while(q-ltag=true)q=q-lchild;return q;/中根遍历的上一个节点node* inPre(node* p)node *q= p-lchild;if(p-ltag=true)/ 如果 P 的左子树存在,则其前驱结点为左子树的最右结点while(q-rtag=true)q=q-rchild;return q;/左子树的最右结点/中序遍历void thInOrder(head h)node* temp;temp=h;dotemp
17、=inNext(temp);if(temp!=h)coutelementrchild=s-rchild;r-rtag=s-rtag;r-lchild=s;r-ltag=false;/ 新插入的节点木有左子树,所以 lchild 指向的是父节点s-rchild=r;s-rtag=true;/ 原节点的右孩子为新插入的节点if(r-rtag=true)/这里是神马意思呢 q|?|p,就是如果被插节点 s 有右子树 ,/找出被插节点 s的的 next 位置,即右子树中的最左节点,令其 lchild 指向新添加的节点 r/因为插入前该最左节点的 lchild 指向的是原来节点 sw=inNext(r)
18、;w-lchild=r;/插入左孩子void lInsert(node* s,node* l)node* w;l-lchild=s-lchild;l-ltag=s-ltag;l-rchild=s;l-rtag=false;s-lchild=l;s-ltag=true;if(l-ltag=true)/ 与插入右孩子方法相似,只需把左右方向对调即可w=inPre(l);w-rchild=l;int main()head h=new node;node* root=new node;node* lc=new node;node* rc=new node;node* c=new node;root-e
19、lement=1;lc-element=2;rc-element=3;c-element=4;h-rchild=root;h-lchild=h;h-ltag=true;h-rtag=true;root-lchild=h;root-rchild=h;root-ltag=false;root-rtag=false;/构造线索树 213lInsert(root,lc);rInsert(root,rc);thInOrder(h);coutheap.elementsi/2.data)heap.elementsi=heap.elementsi/2;i/=2;Heap.n+;Heap.elementsi=e
20、lement;Elementtype DeleteMax(HEAP&heap)/删除堆中最大元素int paraent=1,child=2;Elementtype element,tmp;If(!HeapEmpty(heap)Element=heap.elements1;Tmp=heap.elementsheap.n-;While(child=heap.n)If(childheap.n)&(heap.elementschild.data=heap.elementschild.data)break;Heap.elementsparaent=heap.elementschild;Paraent=c
21、hild;Child*=2;Heap.elementsparaent=tmp;Return element;Int Find(HEAP,datatype x)int m=1;While(mH.n)&(H.elementsm.data!=x)If(H.elementsm.data=x)m+;else return 0;else m+;if(m=H.n)return m;else return 0;Int main()HEAP H;Elementtype element;Int data=1,3,5,7,9,11,13;H.n=0;For(int i=0;i7;i+)element.key=i+1
22、;Element.data=datai;Insert(H,element);for(int i;i=H.n;i+)coutH.elementsi.dataendl;DeleteMax(H);For(int i=1;i=H.n;i+)coutH.elementsi.data ;Cout,endl;Coutx;CoutFind(H,x)endl;十二、给定叶子结点的权值集合 15, 3,14, 2, 6, 9, 16, 17 ,构造相应的哈夫曼树,并计算其带权路径长度。十三、已知 n=9 和一组等价关系:15、68、72、98、37、42、93试应用抽象数据类型 MFSET 设计一个算法,按输入的
23、等价关系进行等价分类。#include#define n 9/MEFSET 元素个数/MFSET 抽象数据型struct mfnodeint father;/ 指向父节点的链int count;/ 树结点个数;typedef mfnode MFSETn+1;void Union(int A, int B, MFSET C)/合并 A 和 Bif(CA.countCB.count)CB.father=A;/B 并入 ACA.count+=CB.count;elseCA.father=B;/A 并入 BCB.count+=CA.count;int Find(int x, MFSET C)/ 求包含
24、元素 x 的树的根int f;f=x;while(Cf.father!=0)/ 未到根f=Cf.father;return f;void Initial(int A, MFSET C)/ 集合 A 只包含元素 ACA.father=0;CA.count=1;/ 等价分类void Equivalence(MFSET S)int i, j, m, k;for(i=1; ii;cinj;while(!(i=0 & j=0)/ 输入 0,0 结束等价分类k=Find(i, S);m=Find(j, S);if(k!=m)Union(k, m, S);cini;cinj;void print_MFSET
25、(MFSET S)/输出等价类int rn+1n+1=0, k;for(int i=1; i=n; i+)k=Find(i, S);rk0+;rkrk0=i;for(i=1; i0)cout;for(int j=1; jri0; j+)coutrij,;coutriri0endl;void main()MFSET S;Equivalence(S);print_MFSET(S);十四、画出下图所示的森林经转换后所对应的二叉树, 并指出在二叉树中某结点为叶子结点时,所对应的森林中结点应满足的条件。十五、已知森林 F 的先根序列为: ABCDEFGHIJKL ,后根序列为: CBEFDGAJIKLH ,试画出森林 F。提示:先画出森林 F 所对应的二叉树 B,然后再将 B 转换为森林。十六、画出表达式 (A+B*C/D)*E+F*G
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1