1、第四次作业一、选择题1、在线索二叉树中,t所指结点没有左子树的充要条件是 D 。A. t-left=NULL B. t-ltag=TRUEC. t-ltag=TRUE且t-left=NULL D. 以上都不对/t所指结点没有左子树的充要条件是:t-ltag=false2、n个结点的线索二叉树上含有的线索数为 C 。A. 2n B. n-1 C. n+1 D. N/二叉树中叶子节点比度为2的结点多一个,而线索二叉树中叶子结点都有两条线索,度为1的结点有一条线索,度为2的结点没有线索,所以二叉树除去其中一个叶子节点剩下的n-1个结点有n-1条线索,再加上除去的叶子节点的两条线索一共n+1条线索3、
2、具有n(n1)个结点的完全二叉树中,结点 i(2in)的左孩子结点是 D 。A. 2i B. 2i+1 C. 2i-1 D. 不存在/根据堆的特点,结点i左孩子节点应该是2i,而2in,所以不存在4、将一颗有100个结点的完全二叉树从上到下、从左到右一次对结点进行编号,根结点的编号为1,则编号为45的结点的右孩子的编号为 D 。A. 46 B. 47 C. 90 D. 91/根据堆结构的特点,编号k的结点,做孩子编号为2k,右孩子编号 2k+15、在结点数为n的堆中插入一个结点时,复杂度为 C 。A. O(n) B. O(n2) C. O(log2n) D. O(logn2)/如果对的高度为h
3、,则需要遍历h次6、两个二叉树是等价的,则它们满足 D 。A. 它们都为空 B. 它们的左右子树都具有相同的结构C. 它们对应的结点包含相同的信息 D. A或B 和C7、包含n个元素的堆的高度为 C 。(符号a表示取不小a最小整数)A. n B. log2n C. log 2(n+1) D. n+1/堆是完全二叉树二、填空题1、如果一颗完全二叉树的任意一个非终结结点的元素都 不小于 其左儿子结点和右儿子结点(如果有的话) 的元素,则称此完全二叉树为最大堆。2、堆是一种特殊形式的 完全 二叉树,对于最大堆而言,其根结点的元素的值应该是所有结点元素中 最大 的。3、二叉树的复制是指按照一棵已知的二
4、叉树复制一个副本,使两者 等价 。复制二叉树最长用的方法是 后根遍历递归算法 。4、在定义堆时,通常采用 结构体 方式定义相应的二叉树,这样可以很容易实现其相关操作。5、在构建选择树时,根据孩子结点的获胜者确定他们双亲结点所得到的选择树称为 胜者树 。根据孩子结点的失败者确定他们双亲结点所得到的选择树称为 败者树 。6、树的表示方法包括数组表示 、 邻接表表示 和 左右链表示。三、画出下图所表示的二叉树的中序线索二叉树和先序线索二叉树。纠正:先序线索二叉树4节点的左子树应指向前驱结点2四、已知二叉树的先根序列是AEFBGCDHIKJ,中根序列是 EFAGBCHKIJD,画出此二叉树,并画出后序
5、线索二叉树。五、在中序线索二叉树中插入一个结点Q 作为树中某个结点P的左孩子,试给出相应的算法。要求:1、 定义中序线索二叉树的型THTREE以及基本操作。2、 定义函数void LInsert(THTREE P, THTREE Q); 实现题目要求的操作。在主函数中,利用操作RInsert和LInsert构造一个线索二叉树,并中序输出二叉树的结点的元素,验证结果。/中序线索二叉树的左右节点插入操作#include/中序线索二叉树节点类型struct nodenode * lchild;node * rchild;bool ltag;/左右子树是否存在bool rtag;char info;t
6、ypedef node THTREE;/求后驱节点node * Next(node * P)node * Q = P-rchild;if(P-rtag=true)/如果P的右子树存在,则其后驱结点为右子树的最左结点while(Q-ltag=true)Q=Q-lchild;return Q;/右子树的最左子树/求前驱结点node *Previous(node *P)node *Q = P-lchild;if(P-ltag=true)/如果P的左子树存在,则其前驱结点为左子树的最右结点while(Q-rtag=true)Q=Q-rchild;return Q;/左子树的最右结点/中根遍历线索二叉树
7、void ThInOrder(THTREE * HEAD)node * temp = HEAD;coutinforchild=S-rchild;R-rtag=S-rtag;R-lchild=S;R-ltag=false;S-rchild=R;S-rtag=true;if(R-rtag=true)/如果本来有右子树W=Next(R);W-lchild=R;/将右边插入的结点R 的后驱的左孩子指向 R/左插入结点void LInsert(node * S,node * L)node * W;L-lchild=S-lchild;L-ltag=S-ltag;L-rtag=false;L-rchild=
8、S;S-lchild=L;S-ltag=true;if(L-ltag = true)/如果S本来有左子树W = Previous(L);W-rchild = L;/将左边插入的结点L的前驱的右孩子指向 Lvoid main()/HEAD为头结点,A为根节点node * HEAD= new node;/头结点node * A=new node;/根节点HEAD-info=!;A-info=A;HEAD-rchild=A;HEAD-lchild=HEAD;HEAD-rtag=true;HEAD-ltag=true;A-lchild=HEAD;A-rchild=HEAD;A-rtag=false;A
9、-ltag=false;node * B = new node;/左孩子B-info=B;node * C = new node;/右孩子C-info=C;/构造线索二叉树BACLInsert(A,B);RInsert(A,C);ThInOrder(HEAD);coutinfo = D;node * E = new node;E-info = E;LInsert(A,D);RInsert(A,E);ThInOrder(HEAD);cout #define Maxsize 200 /最大堆的容量+1typedef structint data;elementtype;typedef struct
10、 elementtype elementsMaxsize;int n;/元素个数HEAP;void MaxHeap(HEAP bool HeapEmpty(HEAP heap) /判断堆是否为空 if ( !(heap.n) )return true;elsereturn false; bool HeapFull(HEAP heap) /判断堆是否为满 if ( heap.n = Maxsize - 1 )return true;elsereturn false; void Insert(HEAP if( !HeapFull(heap) )/堆不满i = +heap.n;while( (i!=
11、1) i /= 2;heap.elementsi = element; /这样插入堆中H0的空间就浪费掉了elementtype DeleteMax(HEAP elementtype element, tmp;if ( !HeapEmpty(heap) )element = heap.elements1;tmp = heap.elementsheap.n-;while ( child = heap.elementschild.data )break;heap.elementsparaent = heap.elementschild;paraent = child;child *= 2;heap
12、.elementsparaent = tmp; return element; /查找堆中的元素,如果存在返回元素的位置,如果不存在返回 0/*int Find(HEAP H, int x) int p = 1; /用p临时表示x在最大堆中的位置for(;pH.elements2*p.dataif(x=H.elementsp.data)return p;else if(xH.elements2*p.dataelse/如果x既不大于左子树也不大于右子树p+;*/有bug,当x比左右节点都小时会把左子树的情况忽略掉/递归方法优化,x为要查找的元素,h为查找起点int Find(HEAP H,int
13、 x,int h)int i=h;int y=0;if(H.elementsh.data=x)return i;if(H.elements2*i.data=x)y=Find(H,x,i*2);if(y=0return y;void main()HEAP H; /定义一个堆elementtype element;/定义一个堆元素 int data = 1, 3, 5, 7, 9, 11, 13;/堆中的元素值数组MaxHeap(H);/空堆/向堆中插入元素构成最大堆,堆中H0空间没有利用for ( int i = 0; i x;cout x;cout “该元素在堆中的位置为:“ Find(H,x,1) endl;要求:1、上述作业要求在单独完成;2、完成后,于规定期限内提交到ftp服务器的相应目录中中,注意,在提交时将所编写的程序统一拷贝到一个Word文件中,文件名格式为“学号+姓名”。