《数据结构(树)(22页).doc》由会员分享,可在线阅读,更多相关《数据结构(树)(22页).doc(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-数据结构与算法上机作业第三章 树一、选择题1、在一棵树中,如果结点A有3个兄弟,B是A的双亲,则B的度为 D A. 1B. 2C. 3D. 42、深度为h的完全二叉树至少有 D 个结点,至多有 B 个结点A. 2hB. 2h-1C. 2h+1D. 2h-13、具有n个结点的满二叉树有 C 个叶结点。A. n/2B. (n-1)/2C. (n+1)/2D. n/2+14、一棵具有25个叶结点的完全二叉树最多有 C 个结点。A. 48B. 49C. 50D. 515、已知二叉树的先根遍历序列是ABCDEF,中根遍历序列是CBAEDF,则后根遍历序列是 A 。A. CBEFDAB. FEDCBAC
2、. CBEDFAD. 不定6、具有10个叶结点的二叉树中有 B 个度为2的结点。A. 8B. 9C. 10D. 117、一棵非空二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足 B 。A. 所有非叶结点均无左孩子B. 所有非叶结点均无右孩子C. 只有一个叶子结点D. A和B同时成立8、在线索二叉树中,t所指结点没有左子树的充要条件是 D 。A. t-left=NULLB. t-ltag=TRUEC. t-ltag=TRUE且t-left=NULLD. 以上都不对9、n个结点的线索二叉树上含有的线索数为 C 。A. 2nB. n-1C. n+1D. n10、二叉树按照某种顺序线索化
3、后,任一结点都有指向其前驱和后继的线索,这种说法 B 。A. 正确B. 错误C. 不确定D. 都有可能11、具有n(n1)个结点的完全二叉树中,结点i(2in)的左孩子结点是 D 。A. 2i B. 2i+1C. 2i-1D. 不存在12、具有64个结点的完全二叉树的深度为 C 。A. 5B. 6C.7D. 813、将一颗有100个结点的完全二叉树从上到下、从左到右一次对结点进行编号,根结点的编号为1,则编号为45的结点的右孩子的编号为 D 。A. 46B. 47C. 90D. 9114、在结点数为n的堆中插入一个结点时,复杂度为 C 。A. O(n)B. O(n2)C. O(log2n)D.
4、 O(logn2)15、两个二叉树是等价的,则它们满足 D 。A. 它们都为空B. 它们的左右子树都具有相同的结构C. 它们对应的结点包含相同的信息 D. A、B和C16、包含n个元素的堆的高度为 C 。(符号a表示取不小a最小整数)A. nB. log2nC. log2(n+1)D. n+117、以下说法错误的是 B 。A. 存在这样的二叉树,对其采用任何次序的遍历其结点访问序列均相同B. 二叉树是树的特殊情形C. 由树转换成二叉树,其根结点的右子树总是空的D. 在二叉树中只有一棵子树的情形下,也要指出是左子树还是右子树18、设F是一个森林,B是由F变换得到的二叉树。若F中有n个非终端结点,
5、则B中没有右孩子的结点有 C 个。A. n-1B. nC. n+1D. n+219、将一棵树T转换为二叉树B,则T的后根序列是B的 B 。A. 先根序列B. 中根序列C. 后根序列D. 层次序列20、将一棵树转换为二叉树后,这颗二叉树的形态是 B 。A. 唯一的,根结点没有左孩子B. 唯一的,根结点没有右孩子C. 有多种,根结点都没有左孩子D. 有多种,根结点都没有右孩子21、设树T的度为4,其中度为1, 2, 3, 4的结点个数分别为4, 2, 1, 1,则T中的叶结点的个数为 D 。A. 5B. 6C. 7D. 822、设森林F中有三棵树,第一、第二、第三棵树的结点个数分别为M1, M2,
6、 M3。与森林F对应的二叉树根结点的右子树上的结点个数为 D 。A. M1-1B. M1+M2C. M2D. M2+M323、若以二叉树的任一结点出发到根的路径上所经过的结点序列按其关键字有序,则该二叉树是 C 。A. 二叉排序树B. 哈夫曼树C. 堆D. 线索二叉树24、用5个权值3, 2, 4, 5, 1构造的哈夫曼树的带权路径长度是 C 。A. 32B. 33C. 34D. 15二、填空题1、一棵二叉树有67个结点,结点的度是0和2。问这棵二叉树中度为2的结点有 33 个。2、含A, B, C三个结点的不同形态的二叉树有 0 棵。3、含有4个度为2的结点和5个叶子结点的完全二叉树,有 1
7、 个度为1的结点。4、具有100个结点的完全二叉树的叶子结点数为 50 。5、在用左右链表示的具有n个结点的二叉树中,共有 2n 个指针域,其中 n-1 个指针域用于指向其左右孩子,剩下的 n+1 个指针域是空的。 6、如果一颗完全二叉树的任意一个非终结结点的元素都 大于等于 其左儿子结点和右儿子结点(如果有的话)的元素,则称此完全二叉树为最大堆。7、堆是一种特殊形式的 完全二叉树 二叉树,对于最大堆而言,其根结点的元素的值应该是所有结点元素中 最大的 的。8、二叉树的复制是指按照一棵已知的二叉树复制一个副本,使两者 等价 。复制二叉树最长用的方法是 后根遍历递归算法 。9、在定义堆时,通常采
8、用 数组 方式定义相应的二叉树,这样可以很容易实现其相关操作。10、在构建选择树时,根据孩子结点的获胜者确定他们双亲结点所得到的选择树称为 胜者树 。根据孩子结点的失败者确定他们双亲结点所得到的选择树称为 败者树 。11、树的表示方法包括 数组 、 邻接表 和 左右链 。12、表达式(a+b*(c-d)-e/f的波兰式(前缀式)是 -+a*b-cd/ef ,逆波兰式(后缀式)是 abcd-*+e/f- 。13、设F是由T1、T2、T3三棵树组成的森林,与F对应的二叉树为B。已知T1, T2, T3的结点数分别为n1, n2和n3,则二叉树B的左子树中有 n1-1 个结点,二叉树B的右子树中有
9、n2+n3 个结点。14、设二叉树的中根序列为ABCDEFG,后根序列为BDCAFGE。则该二叉树的先根序列为EGCBDGF 。该二叉树对应的森林中包含 2 棵树。15、先根次序遍历森林等同于按 先根 遍历对应的二叉树,后根次序遍历森林等同与按 中根 遍历对应的二叉树。16、一棵哈夫曼树有19个结点,则其叶子结点的个数为 10 。17、设有数据WG=7, 19, 2, 6, 32, 3, 21, 10叶节点权重集合,则所构建哈夫曼树的高是 6 ,带权路径长度WPL为 261 。18、设有一份电文中共使用6个字符a, b, c, d, e, f,其中出现频率依次为2,3,4,7,8,19,则字符
10、c的哈夫曼编码是 001 ,电文编码的总长度为 96 。20、在有n个结点的哈夫曼树中,叶子结点总数为 (n+1)/2 ,非叶结点的总数为 (n-1)/2 。三、试分别画出具有4个结点的二叉树的所有不同形态。四、已知一棵二叉树的中根序列和后根序列分别是BDCEAHFG和DECBHGFA,请画出此二叉树。五、已知非空二叉树T,写一个算法,求度为2的结点的个数。要求:1、定义二叉树的抽象数据类型和型BTREE,并定义基本操作。2、编写函数count2(BTREE T),返回度为2的节点的个数。 3、在主函数中,构建一个二叉树,并验证所编写的算法。六、用递归方法写一个算法,求二叉树的叶子结点数int
11、 leafnum(BTREE T)。要求:1、 定义二叉树的抽象数据类型和型BTREE,并定义基本操作。2、 编写函数leafnum(BTREE T),返回树T的叶子节点的个数。在主函数中,构建一个二叉树,并验证所编写的算法。七、画出下图所表示的二叉树的中序线索二叉树和先序线索二叉树。 八、已知二叉树的先根序列是AEFBGCDHIKJ,中根序列是EFAGBCHKIJD,画出此二叉树,并画出后序线索二叉树。九、在中序线索二叉树中插入一个结点Q作为树中某个结点P的左孩子,试给出相应的算法。要求:1、 定义中序线索二叉树的型THTREE以及基本操作。2、 定义函数void LInsert(THTRE
12、E P, THTREE Q); 实现题目要求的操作。在主函数中,利用操作RInsert和LInsert构造一个线索二叉树,并中序输出二叉树的结点的元素,验证结果。十、假设现在有如下的元素:7、16、49、82、5、31、6、2、44。画出将每一个元素插入堆中以后的最大堆。要求:利用基本操作Insert的基本原理,先用第一个元素7构成一个二叉树,然后将第二个元素16插入该二叉树中,再将第三个元素49插入堆中,直到最后一个元素插入为止。上述过程要求画图完成。十一、编写一个函数,在最大堆中查找任意元素,并分析其时间复杂度。要求:1、 定义最大堆的型HEAP及其基本操作。2、 定义函数int Find
13、(HEAP H, Elementtype e),查找e是否为堆的元素,如果是,返回该元素在堆中的位置,如果不是,返回0。(提示:利用最大堆的元素特点进行查找,可降低复杂度)在主函数中首先构建一个二叉树,然后验证所构造的函数。十二、给定叶子结点的权值集合15, 3,14, 2, 6, 9, 16, 17,构造相应的哈夫曼树,并计算其带权路径长度。十三、已知n=9和一组等价关系: 15、68、72、98、37、42、93 试应用抽象数据类型MFSET设计一个算法,按输入的等价关系进行等价分类。十四、画出下图所示的森林经转换后所对应的二叉树,并指出在二叉树中某结点为叶子结点时,所对应的森林中结点应满
14、足的条件。十五、已知森林F的先根序列为:ABCDEFGHIJKL,后根序列为:CBEFDGAJIKLH,试画出森林F。提示:先画出森林F所对应的二叉树B,然后再将B转换为森林。十六、画出表达式(A+B*C/D)*E+F*G所对应的树结构,并写出该表达式的波兰表示式和逆波兰表示式。十七、利用逆波兰表达式求一个四则混合元算的值。具体要求:1、 定义二叉树的型BTREE和位置的型position。2、 实现二叉树的基本操作。3、 实现将一个四则混合运算转换成二叉树的函数:BTREE convert(char *express),其中参数express为四则混合运算表达式,返回值为生成的树。4、 实现
15、计算四则混合运算的值的函数:double computer(BTREE bt),其中,参数bt为四则运算所对应的树,返回值为计算结果。提示:先求树的的波兰表达式,然后利用栈结构计算表达式的值。在主函数中进行测试,求2+3*(5+8)/4-5的值。要求:1、上述作业要求在单独完成;2、完成后,于规定期限内提交到ftp服务器的相应目录中中,注意,在提交时将所编写的程序统一拷贝到一个Word文件中,文件名格式为“学号+姓名”三ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD四BCAFEDGH五、六代码#includeusing name
16、space std;typedef char datatype;struct nodenode *lchild;datatype data;node *rchild;typedef node *BTREE;void CreateBTREE(BTREE &BT,char *&str)/先根输入树 char ch;ch=*str+;if(ch=#)BT=NULL;elseBT=new node;BT-data=ch;CreateBTREE(BT-lchild,str);CreateBTREE(BT-rchild,str);void Empty(BTREE BT)BT=NULL;bool IsEmp
17、ty(BTREE BT)/判断是否为空 if(BT=NULL)return true;elsereturn false;BTREE CreateBT(datatype v,BTREE ltree,BTREE rtree)/用左右子树建立二叉树 BTREE root;root=new node;root-data=v;root-lchild=ltree;root-rchild=rtree;return root;BTREE Lchild(BTREE BT)/返回左子树 return BT-lchild;BTREE Rchild(BTREE BT)/返回右子树 return BT-rchild;d
18、atatype Data(BTREE BT)/返回节点元素值 return BT-data;void visit(datatype dt)coutlchild)&(BT-rchild)return 1+count2(Lchild(BT)+count2(Rchild(BT);if(BT-lchild)&(BT-rchild=NULL)return count2(Lchild(BT);if(BT-lchild=NULL)&(BT-rchild)return count2(Rchild(BT);int leafnum(BTREE BT)static int count=0;if(BT-lchild=
19、NULL&BT-rchild=NULL)return +count;elseleafnum(Lchild(BT);leafnum(Rchild(BT);int main()BTREE BT=NULL;char *str=abc#d#ef#g#;CreateBTREE(BT,str);cout度为2的节点的个数:count2(BT)endl;cout叶子节点个数:leafnum(BT)endl;七head中序线索二叉树798653421先序线索二叉树689735124head八二叉树BGAEFCDHJIK后序线索二叉树BGAEFCDHJIKHead九#includeusing namespace
20、 std;typedef char datatype;struct nodenode *lchild;node *rchild;bool ltag;bool rtag;datatype data;typedef node *THTREE;THTREE InPre(THTREE P)/求中序前驱(右子树的最左节点)THTREE Q=P-lchild;if(P-ltag=true)while(Q-rtag=true)Q=Q-rchild;return Q;THTREE InNext(THTREE P)/求中序后继(左子树的最右节点)THTREE Q=P-rchild;if(P-rtag=true)
21、while(Q-ltag=true)Q=Q-lchild;return Q;/二叉树中插入一个结点Q作为树中某个结点P的左孩子void LInsert(THTREE P,THTREE Q)THTREE W;Q-lchild=P-lchild;Q-ltag=P-ltag;Q-rchild=P;Q-rtag=false;P-lchild=Q;P-ltag=true;if(Q-ltag=true)/如果P节点有左孩子W=InPre(Q);W-rchild=Q;void RInsert(THTREE P,THTREE Q)THTREE W;Q-rchild=P-rchild;Q-rtag=P-rtag
22、;Q-lchild=P;Q-ltag=false;P-rchild=Q;P-rtag=true;if(Q-rtag=true)/如果P节点有右孩子W=InNext(Q);W-lchild=Q;void ThInOrder(THTREE HEAD)THTREE temp;temp=HEAD;dotemp=InNext(temp);if(temp!=HEAD)coutdata);while(temp!=HEAD); int main()node *HEAD=new node;node *A=new node;HEAD-data=!;A-data=A; HEAD-lchild=A;HEAD-rchi
23、ld=HEAD;HEAD-ltag=true;HEAD-rtag=true;A-lchild=HEAD;A-rchild=HEAD;A-ltag=false;A-rtag=false; node *B=new node;B-data=B;node *C=new node;C-data=C;node *D=new node;D-data=D;node *E=new node;E-data=E;node *F=new node;F-data=F;node *G=new node;G-data=G;LInsert(A,B);RInsert(A,C);LInsert(B,D);RInsert(B,E)
24、;LInsert(C,F);RInsert(C,G);ThInOrder(HEAD);十16744263158249716263158249716631582497163158249716582497168249716491677十一#include#define MaxSize 200using namespace std;typedef structint data;Elementtype;typedef structElementtype elementsMaxSize;int n;HEAP;void MaxHeap(HEAP &heap)/创建一个空堆 heap.n=0;bool He
25、apEmpty(HEAP heap)/判断是否为空堆 return (!heap.n); bool HeapFull(HEAP heap)/判断是否满堆 return(heap.n=MaxSize-1);void Insert(HEAP &heap,Elementtype element)/最大堆插入一个元素 int i;if(!HeapFull(heap)i=+heap.n;while(i!=1&(element.dataheap.elementsi/2.data)heap.elementsi=heap.elementsi/2;i/=2;heap.elementsi=element;Elem
26、enttype DeleteMax(HEAP &heap)/删除堆中的最大元素 int parent=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.elementsparent=heap.elementschild;parent=child;child
27、*=2;heap.elementsparent=tmp;return element;int Find(HEAP &H,Elementtype e)/查找e是否为堆中元素 int i=H.n,j;if(e.data=H.elements1.data)return 1;if(i!=0)if(e.data=H.elementsi.data)return i;else if(e.dataH.elementsi/2.data)&(e.dataH.elementsi/4.data)j=i/4+1;while(ji)if(e.data=H.elementsj.data)return j;j+;return
28、 0;elsei/=4;int main()HEAP H;H.n=0;Elementtype element;int data=7,16,49,82,5,31,6,2,44;for(int i=0;i9;i+)element.data=datai;Insert(H,element);cout最大堆元素为:endl;for(int i=1;i=9;i+)coutH.elementsi.datat;coutendl;cout请输入要查找的元素element.data;cout该元素在堆中的位置为Find(H,element)endl;2923651191415161733208249十二WPL=(
29、16+17)*2+(9+14+15)*3+6*4+(2+3)*5=229十三#include#define n 9 using namespace std;struct nodeint father;int count;typedef node MFSETn+1;void Union(int A,int B,MFSET C)/如果集合擦CA CB不相交 if(CA.countCB.count)CB.father=A;CA.count=CA.count+CB.count;/并入A elseCA.father=B;CB.count=CA.count+CB.count;/并入Bint Find(in
30、t x,MFSET C)/求包含x的集合 int f;f=x;while(Cf.father!=0)f=Cf.father;return f;void Initial(int A,MFSET C)CA.father=0;/集合A只包含元素A,个数为1; 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);/求i的根 m=Find(j,S);/求j的根 if(k!=m)/若k=m,说明i,j已经在一棵树中,不需要合并Union(k,m,S);cini;cinj; int main()MFSET S;Equivalence(S);int rn+1n+1=,k;for(int i=1;i=n;i+)k=Find(i,S);rk0+;rkrk0=i;for(int i=1;i0)for(int j=1;j=ri0;j+)coutrijt; coutendl;十四JABCDEFGHI最左树最左节点和每棵树最右节点BCDFGEAHIJKL十五十六ACBD*/FE+*+G*表达式(A+B*C/D)*E+F*G波兰表达式: +*+A/*BCDE*FG逆波兰表达式: ABC*D/+E*FG*+十七-第 22 页-