数据结构与算法
上机作业

第四次作业
一、选择题
1、具有n(n>1)个结点的完全二叉树中,结点i(2i>n)的左孩子结点是    D     
    A. 2i        B. 2i+1        C. 2i-1        D. 不存在
2、将一颗有100个结点的完全二叉树从上到下、从左到右一次对结点进行编号,根结点的编号为1,则编号为45的结点的右孩子的编号为      D     
    A. 46        B. 47        C. 90        D. 91
3、在结点数为n的堆中插入一个结点时,复杂度为        C     
    A. O(n)        B. O(n2)        C. O(log2n)    D. O(logn2)
4、两个二叉树是等价的,则它们满足        D   
    A. 它们都为空                B. 它们的左右子树都具有相同的结构
    C. 它们对应的结点包含相同的信息        D. A、B和C
5、包含n个元素的堆的高度为    C      。(符号「a表示取不小a最小整数
    A. n        B. log2先序中序后序遍历二叉树n        C. 「log2(n+1)        D. n+1
6、以下说法错误的是        B       
    A. 存在这样的二叉树,对其采用任何次序的遍历其结点访问序列均相同
    B. 二叉树是树的特殊情形
    C. 由树转换成二叉树,其根结点的右子树总是空的
    D. 在二叉树中只有一棵子树的情形下,也要指出是左子树还是右子树
7、设F是一个森林,B是由F变换得到的二叉树。若F中有n个非终端结点,则B中没有右孩子的结点有      C      个。
    A. n-1        B. n        C. n+1        D. n+2
8、将一棵树T转换为二叉树B,则T的后根序列是B的      B   
    A. 先根序列        B. 中根序列        C. 后根序列        D. 层次序列
9、设树T的度为4,其中度为1, 2, 3, 4的结点个数分别为4, 2, 1, 1,则T中的叶结点的个数为      D   
    A. 5        B. 6        C. 7        D. 8
10、设森林F中有三棵树,第一、第二、第三棵树的结点个数分别为M1, M2, M3。与森林F对应的二叉树根结点的右子树上的结点个数为    D     
    A. M1-1        B. M1+M2        C. M2        D. M2+M3
11、若以二叉树的任一结点出发到根的路径上所经过的结点序列按其关键字有序,则该二叉树是      C     
    A. 二叉排序树    B. 哈夫曼树        C. 堆        D. 线索二叉树
12、用5个权值{3, 2, 4, 5, 1}构造的哈夫曼树的带权路径长度是    B   
    A. 32        B. 33        C. 34        D. 15
二、填空题
1、如果一颗完全二叉树的任意一个非终结结点的元素都    不小于      其左儿子结点和右儿子结点(如果有的话)的元素,则称此完全二叉树为最大堆。
2、堆是一种特殊形式的    完全      二叉树,对于最大堆而言,其根结点的元素的值应该是所有结点元素中    最大      的。
3、二叉树的复制是指按照一棵已知的二叉树复制一个副本,使两者  等价    。复制二叉树最长用的方法是  后根遍历递归算法     
4、在定义堆时,通常采用  结构体        方式定义相应的二叉树,这样可以很容易实现其相关操作。
5、在构建选择树时,根据孩子结点的获胜者确定他们双亲结点所得到的选择树称为    胜者树      。根据孩子结点的失败者确定他们双亲结点所得到的选择树称为  败者树     
6、树的表示方法包括  数组            邻接表              左右链       
7、表达式(a+b*(c-d))-e/f的波兰式(前缀式)是    -+a*b-cd/ef                ,逆波兰式(后缀式)是      abcd-*+ef/-             
8、设F是由T1、T2、T3三棵树组成的森林,与F对应的二叉树为B。已知T1, T2, T3的结点数分别为n1, n2和n3,则二叉树B的左子树中有  n1-1          个结点,二叉树B的右子树中有      n2+n3    个结点。
9、设二叉树的中根序列为ABCDEFG,后根序列为BDCAFGE。则该二叉树的先根序列为
    EACBDGF              。该二叉树对应的森林中包含  2        棵树。
10、先根次序遍历森林等同于按    先根        遍历对应的二叉树,后根次序遍历森林等同与按      中根      遍历对应的二叉树。
11、一棵哈夫曼树有19个结点,则其叶子结点的个数为    10       
12、设有数据WG={7, 19, 2, 6, 32, 3, 21, 10}叶节点权重集合,则所构建哈夫曼树的高是  5 ,带权路径长度WPL为      169     
13、设有一份电文中共使用6个字符a, b, c, d, e, f,其中出现频率依次为2,3,4,7,8,14,则字符c的哈夫曼编码是    001    ,电文编码的总长度为    80     
15、在有n个结点的哈夫曼树中,叶子结点总数为    (n+1)/2  ,非叶结点的总数为  (n-1)/2   
三、假设现在有如下的元素:7、16、49、82、5、31、6、2、44。画出将每一个元素插入堆中以后的最大堆。
要求:
利用基本操作Insert的基本原理,先用第一个元素7构成一个二叉树,然后将第二个元素16插入该二叉树中,再将第三个元素49插入堆中,……,直到最后一个元素插入为止。上述过程要求画图完成。
四、编写一个函数,在最大堆中查任意元素,并分析其时间复杂度。
要求:
1、定义最大堆的型HEAP及其基本操作。
2、定义函数int Find(HEAP H, Elementtype e),查e是否为堆的元素,如果是,返回该元素在堆中的位置,如果不是,返回0。(提示:利用最大堆的元素特点进行查,可降低复杂度)
在主函数中首先构建一个二叉树,然后验证所构造的函数。
typedefstryct{
int key;
datathpe data;
}elementtype;
Typedefstruct{
Elementtype elements[Maxsize];
int n;
}HEAP;
Void MaxHeap(HEAP heap)//创建一个空堆
{ heap.n=0;}
Bool HeapEmpty(HEAP heap)//判断堆是否为空
{
If(!(heap.n))return true;
Else return false;
}
Bool HeapFull(HEAP heap)//判断堆是否为满
{if(heap.n==Maxsize-1) return true;
Else return false;
}
Void Insert(HEAP&heap,elementtype element)//在堆heap中插入元素为element的结点
{
Int I;
If(!HeapFull(heap)){
I=heap.n+1;
While((i!=1)&&(element.data>heap.elements[i/2].data))
{heap.elements[i]=heap.elements[i/2];
i/=2;
}
Heap.n++;
Heap.elements[i]=element;
}
}
Elementtype DeleteMax(HEAP&heap)//删除堆中最大元素
{int paraent=1,child=2;
Elementtype element,tmp;
If(!HeapEmpty(heap)){
Element=heap.elements[1];
Tmp=heap.elements[heap.n-];
While(child<=heap.n)
{
If((child<heap.n)&&(heap.elements[child].data<heap.elements[child+1].data))child++;
If(tmp.data>=heap.elements[child].data)break;
Heap.elements[paraent]=heap.elements[child];
Paraent=child;
Child*=2;}
Heap.elements[paraent]=tmp;
Return element;}
}
Int Find(HEAP,datatype x)
{int m=1;
While((m<H.n)&&(H.elements[m].data!=x)){
If(H.elements[m].data<x)
If(H.elements[m+1].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;i<7;i++)
{element.key=i+1;
Element.data=data[i];
Insert(H,element);
}for(int i;i<=H.n;i++)cout<<H.elements[i].data<<’’;
Cout<<endl;
DeleteMax(H);
For(int i=1;i<=H.n;i++)cout<<H.elements[i].data<<’’;
Cout<,endl;
Cout<<”查的元素:”;
Int x;
Cin>>x;
Cout<<Find(H,x)<<endl;
}
五、给定叶子结点的权值集合{15, 3,14, 2, 6, 9, 16, 17},构造相应的哈夫曼树,并计算其带权路径长度。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。