2022年考查目标.doc
【考察目的】 1. 理解数据构造的根本概念;掌握数据的逻辑构造、存储构造及其差异,以及各种根本操作的实现。 2. 掌握根本的数据处理原理和方法的根底上,能够对算法进展设计与分析。 3. 能够选择适宜的数据构造和方法进展咨询题求解。 一、线性表大纲要求:(一) 线性表的定义和根本操作 (二) 线性表的实现 1. 顺序存储构造 2. 链式存储构造 3. 线性表的应用 知识点:1 深入理解数据构造的概念,掌握数据构造的“三要素”:逻辑构造、物理(存储)构造及在这种构造上所定义的操作“运算”。2 时间复杂度和空间复杂度的定义,常用计算语句频度来估算算法的时间复杂度。以下六种计算算法时间的多项式是最常用的。其关系为:O(1)<O(logn)<O(n)<O(nlogn) <O(n2)<O(n3)指数时间的关系为: O(2n)<O(n!)<O(nn)3 线性表的逻辑构造,是指线性表的数据元素间存在着线性关系。主要是指:除第一及最后一个元素外,每个结点都只有一个前趋和只有一个后继。在顺序存储构造中,元素存储的先后位置反映出这种逻辑关系,而在链式存储构造中,是靠指针来反映这种逻辑关系的。4 顺序存储构造用向量(一维数组)表示,给定下标,能够存取相应元素,属于随机存取的存储构造。5 线性表的顺序存储方式及其在详细语言环境下的两种不同实现:表空间的静态分配和动态分配。掌握顺序表上实现插入、删除、定位等运算的算法。6 尽管“只要明白某结点的指针就能够存取该元素”,但因链表的存取都需要从头指针开场,顺链而行,故链表不属于随机存取构造。要理解头指针、头结点、首元结点和元素结点的差异。头结点是在插入、删除等操作时,为了算法的统一而设立的(假设无头结点,则在第一元素前插入元素或删除第一元素时,链表的头指针总在变化)。对链表(不包括循环链表)的任何操作,均要从头结点开场,头结点的指针具有标记作用,故头指针往往被称为链表的名字,如链表head是指链表头结点的指针是head。理解循环链表中设置尾指针而不设置头指针的好处。链表操作中应留意不要使链意外“断开”。因而,假设在某结点前插入一个元素或删除某元素,必须明白该元素的前驱结点的指针。7 链表是本部分学习的重点和难点。重点掌握以下几种常用链表的特点和运算:单链表、循环链表、双向链表、双向循环链表的生成、插入、删除、遍历以及链表的分解和归并等操作。并能够设计出实现线性表其它运算的算法。8 从时间复杂度和空间复杂度的角度综合比拟线性表在顺序和链式两种存储构造下的特点,即其各自适用的场合。小结:顺序表和链表的比拟通过对它们的讨论可知它们各有优缺点,顺序存储有三个优点:(1)方法简单,各种高级语言中都有数组,容易实现。(2)不用为表示结点间的逻辑关系而增加额外的存储开销。(3)顺序表具有按元素序号随机访咨询的特点。 但它也有两个缺点:(1)在顺序表中做插入删除操作时,平均挪动大约表中一半的元素,因而对n较大的顺序表效率低。(2)需要预先分配足够大的存储空间,可能过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。链表的优缺点恰好与顺序表相反。在实际中怎么样选取存储构造呢?(1)基于存储的考虑对线性表的长度或存储规模难以可能时,不宜采纳顺序表;链表不用事先可能存储规模,但链表的存储密度较低,显然链式存储构造的存储密度是小于的。(2)基于运算的考虑在顺序表中按序号访咨询ai的时间功能时O(1),而链表中按序号访咨询的时间功能O(n),因而假如经常做的运算是按序号访咨询数据元素,显然顺序表优于链表;而在顺序表中做插入、删除时平均挪动表中一半的元素,当数据元素的信息量较大且表较长时,这一点是不应无视的;在链表中作插入、删除,尽管也要找插入位置,但操作主要是比拟操作,从这个角度考虑显然后者优于前者。(3)基于环境的考虑 顺序表容易实现,任何高级语言中都有数组类型,链表的操作是基于指针的,相对来讲前者简单些,也是用户考虑的一个要素。总之,两种存储构造各有长短,选择那一种由实际咨询题中的主要要素决定。通常“较稳定”的线性表选择顺序存储,而频繁做插入删除的即动态性较强的线性表宜选择链式存储。练习题:(一)选择题:1以下那一个术语与数据的存储构造无关?( A )A队列 B. 哈希表 C. 线索树 D. 双向链表2、一个算法应该是( B )。A程序 B咨询题求解步骤的描绘 C要满足五个根本特性 DA和C.3、数据构造中,与所使用的计算机无关的是数据的( C )A存储构造 B物理构造 C逻辑构造 D物理构造和存储构造4. 算法的计算量的大小称为计算的( B )。A效率 B复杂性 C现实性 D难度5以下说法,不正确的选项(D)。A数据元素是数据的根本单位B数据项是数据中不可分割的最小可标识单位C数据可由假设干个数据元素构成D数据项可由假设干个数据元素构成6连续存储设计时,存储单元的地址( A )。A一定连续 B一定不连续 C不一定连续 D部分连续,部分不连续7. 线性表( a1,a2,an)以链接方式存储时,访咨询第i位置元素的时间复杂性为( C )。AO(i) BO(1) CO(n) DO(i-1)8. 关于顺序存储的线性表,访咨询结点和增加、删除结点的时间复杂度为( C )。AO(n) O(n) B. O(n) O(1) C. O(1) O(n) D. O(1) O(1)9. 设单链表中结点的构造为(data,link)。已经明白指针q所指点是指针p所指结点的直截了当前驱,假设在*q与*p之间插入结点*s,则应执行以下哪一个操作?( B )。As>link=p>link;p>link=sBq>link=s;s>link=pCp>link=s>link;s>link=pDp>link=s;s>link=q10. 在一个长度为n的顺序表的表尾插入一个新元素的渐进时间复杂度为( B )。AO(n) BO(1) CO(n2) DO(log2n)11. 表长为n的顺序存储的线性表,当在任何位置上插入一个元素的概率相等时,插入一个元素所需挪动元素的平均个数为( B )An B. n/2C. (n-1)/2 D. (n+1)/212. 循环链表的主要优点是( D )A不再需要头指针了。B已经明白某个结点的位置后,能特别容易找到它的直截了当前驱结点。C在进展删除操作后,能保证链表不断开。D从表中任一结点出发都能遍历整个链表。(二)应用题1、按增长率由小至大陈列以下7个函数。答:2、数据的存储构造由哪四种根本的存储方法实现,并做以简要说明?答:四种表示方法(1)顺序存储方式。数据元素顺序存放,每个存储结点只含一个元素。存储位置反映数据元素间的逻辑关系。存储密度大,但有些操作(如插入、删除)效率较差。(2)链式存储方式。每个存储结点除包含数据元素信息外还包含一组(至少一个)指针。指针反映数据元素间的逻辑关系。这种方式不要求存储空间连续,便于动态操作(如插入、删除等),但存储空间开销大(用于指针),另外不能折半查找等。(3)索引存储方式。除数据元素存储在一地址连续的内存空间外,尚需建立一个索引表,索引表中索引指示存储结点的存储位置(下标)或存储区间端点(下标),兼有静态和动态特性。(4)散列存储方式。通过散列函数和处理冲突的方法,将关键字散列在连续的有限的地址空间内,并将散列函数的值解释成关键字所在元素的存储地址,这种存储方式称为散列存储。其特点是存取速度快,只能按关键字随机存取,不能顺序存取,也不能折半存取。3. 线性表有两种存储构造:一是顺序表,二是链表。试咨询:(1)假如有 n个线性表同时并存,同时在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。在此情况下,应选用哪种存储构造? 为什么?(2)假设线性表的总数根本稳定,且特别少进展插入和删除,但要求以最快的速度存取线性表中的元素,那么应采纳哪种存储构造?为什么? 答:(1)选链式存储构造。它可动态申请内存空间,不受表长度(即表中元素个数)的妨碍,插入、删除时间复杂度为O(1)。(2)选顺序存储构造。顺序表能够随机存取,时间复杂度为O(1)。(三)算法设计题1设计算法,求带表头的单循环链表的表长。解:int length(Linklist L) int I; listnode *p; I=0; P=L; while (p->next!=L) p=p->next; I+; return I;2.已经明白单链表L,写一算法,删除其重复结点。算法思路:用指针p指向第一个数据结点,从它的后继结点开场到表的完毕,找与其值一样的结点并删除之;p指向下一个;依此类推,p指向最后结点时算法完毕。算法如下:解:void pur_LinkList(LinkList H) LNode *p,*q,*r; p=H->next; /*p指向第一个结点*/ if(p=NULL) return; while (p->next) q=p; while (q->next) /* 从*p的后继开场找重复结点*/ if (q->next->data=p->data) r=q->next; /*找到重复结点,用r指向,删除*r */ q->next=r->next; free(r); /*if*/ else q=q->next; /*while(q->next)*/ p=p->next; /*p指向下一个,接着*/ /*while(p->next)*/该算法的时间功能为O(n2)。3.已经明白指针la和lb分别指向两个无头结点的单链表中的首结点。请编写函数完成从表la中删除自第i个元素开场的共len个元素并将它们插入到表lb中第j个元素之前,假设lb中只有j-1个元素,则插在表尾。函数原型如下:int DeleteAndInsertSub(LinkList la,LinkList lb,int i,int j,int len);答:int DeleteAndInsertSub(LinkList la,LinkList lb,int i,int j,int len)int k; LinkList p,q,prev,s;if(i<0|j<0|len<0)return -1;p=la;k=1;prev=NULL;while(pk<i)prev=p;p=p->next;k+;if(!p)return -1;q=p;k=1;while(qk<len)q=q->next;k+;if(!q)return -1;if(!prev)la=q->next;elseprev->next=q->next;if(j=1)q->next=lb;lb=q;elses=lb;k=1;while(sk<j-1)s=s->next;k+;if(!s)return -1;q->next=s->next;s->next=p;return 1;4写一算法,将一带有头结点的单链表就地逆置,即要求逆置在原链表上进展,不同意重新构造新链表。图 单链表的倒置254525187629L297625184525L(a)(b)函数原型如下:void LinkList_reverse(LinkList L);答:void LinkList_reverse(LinkList L)LinkList p,q,s;p=L->next;q=p->next;s=q->next;p->next=NULL;while(s->next)q->next=p;p=q;q=s;s=s->next;q->next=p;s->next=q;L->next=s;5写一算法,将带有头结点的非空单链表中数据域值最小的那个结点移到链表的最前面。要求:不得额外申请新的链结点。函数原型如下:void delinsert(LinkList L);答:void delinsert(LinkList L)p=L->next;/p是链表的工作指针pre=L;/pre指向链表中数据域最小值结点的前驱q=p;/q指向数据域最小值结点,初始假定是第一结点while(p->next!=NULL)if(p->next->data<q->data)/找到新的最小值结点pre=p;q=p->next; p=p->next;if(q!=L->next)/假设最小值是第一元素结点,则不需再操作pre->next=q->next;/将最小值结点从链表上摘下q->next=L->next;/将q结点插到链表最前面L->next=q;6编写一个算法来交换单链表中指针P所指结点与其后继结点,HEAD是该链表的头指针,P指向该链表中某一结点。答:单链表中查找任何结点,都必须从头指针开场。此题要求将指针p所指结点与其后继结点交换,这不仅要求明白p结点,还应明白p的前驱结点。如此才能在p与其后继结点交换后,由原p结点的前驱来指向原p结点的后继结点。LinkedList Exchange(LinkedList HEAD,p) HEAD是单链表头结点的指针,p是链表中的一个结点。本算法将p所指结点与其后继结点交换。q=head->next; q是工作指针,指向链表中当前待处理结点。pre=head; pre是前驱结点指针,指向q的前驱。while(q!=null q!=p)pre=q;q=q->next; 未找到p结点,后移指针。if(p->next=null)printf(“p无后继结点n”); p是链表中最后一个结点,无后继。Else 处理p和后继结点交换 q=p->next; 暂存p的后继。 pre->next=q; p前驱结点的后继指向p的后继。 p->next=q->next;p的后继指向原p后继的后继。 q->next=p ;原p后继的后继指针指向p。 算法完毕。7已经明白线性链表第一个链结点指针为list,请写一算法,将该链表分解为两个带有头结点的循环链表,并将两个循环链表的长度分别存放在各自头结点的数据域中。其中,线性表中序号为偶数的元素分解到第一个循环链表中,序号为奇数的元素分解到第二个循环链表中。答:算法如下:void split(ListNode *List, ListNode *list1, ListNode *list2)list1=(ListNode *)malloc(sizeof(ListNode );list2=(ListNode *)malloc(sizeof(ListNode );p=list;;q=list1;r=list2;len1=0;len2=0;mark=1;while (p!=null)if(mark=1)q->next=p;q=q->next;len1+;mark=2;elser->next=p;r=r->next;len2+;mark=1;list1->data=len1;list2->data=len2;q->next=list1;r->next=list2;8. 设A和B是两个单链表,其表中元素递增有序。试写一算法将A和B归并成一个按元素值递减有序的单链表C,并要求辅助空间为O(1)。答:Linklist merge(Linklist A,Linklist B)Linklist C;Listnode *p;C=null;while (AB) if(A->data<=B->data) p=A->next;A->next=C;C=A;A=p; else p=B->next;B->next=C;C=B;B=p; if (A)while(A) p=A->next;A->next=C;C=A;A=p; else while(B) p=B->next;B->next=C;C=B;B=p;return C;二、栈、队列和数组大纲要求:(一) 栈和队列的根本概念 (二) 栈和队列的顺序存储构造 (三) 栈和队列的链式存储构造 (四) 栈和队列的应用 (五) 特别矩阵的压缩存储 知识点:1 栈、队列的定义及其相关数据构造的概念,包括:顺序栈、链栈、循环队列、链队列等。栈与队列存取数据(请留意包括:存和取两部分)的特点。2 掌握顺序栈和链栈上的进栈和退栈的算法,并弄清栈空和栈满的条件。留意因栈在一端操作,故通常链栈不设头结点。3 如何将中缀表达式转换成前缀、后缀表达式,理解对两种表达式求值的方法。4 栈与递归的关系。用递归处理的几类咨询题:咨询题的定义是递归的,数据构造是递归的,以及咨询题的解法是递归的。掌握典型咨询题的算法以及将递归算法转换为非递归算法,如n!阶乘咨询题,fib数列咨询题,hanoi咨询题。理解在数值表达式的求解、括号的配对等咨询题中应用栈的工作原理。5 掌握在链队列上实现入队和出队的算法。留意对仅剩一个元素的链队列删除元素时的处理(令队尾指针指向队头)。还需特别留意仅设尾指针的循环链队列的各种操作的实现。6 循环队列队空及队满的条件。队空定义为队头指针等于队尾指针,队满则可用牺牲一个单元或是设标记的方法,这里特别留意取模运算。掌握循环队列中入队与出队算法。7 在后续章节中多处有栈和队列的应用,如二叉树遍历的递归和非递归算法、图的深度优先遍历等都用到栈,而树的层次遍历、图的广度优先遍历等则用到队列。这些方面的应用应重点掌握。8 数组在机器(内存)级上采纳顺序存储构造。掌握数组(主要是二维)在以行序为主和列序为主的存储中的地址计算方法。9 特别矩阵(对称矩阵、对角矩阵、三角矩阵)在压缩存储是的下标变换公式。练习题:(一)选择题:1. 一个栈的输入序列为1 2 3 4,则(D)不可能是其出栈序列。A. 1 2 4 3B. 2 1 3 4C. 1 4 3 2D. 4 3 1 22. 一个递归算法必须包括( B )。A. 递归部分 B. 终止条件和递归部分 C. 迭代部分 D.终止条件和迭代部分3. 一个递归的定义能够用递归过程求解,也能够用非递归过程求解,但单从运转时间来看,通常递归过程比非递归过程(B)。 A较快 B较慢 C一样 D以上答案都不对4. 栈和队列都是(C)A顺序存储的线性表 B链式存储的线性表C限制存储的线性表 D限制存储的非线性构造5. 二维数组N的元素是4个字符(每个字符占一个存储单元)组成的串,行下标i的范围从0到4,列下标j的范围从0到5,N按行存储时元素N35的起始地址与N按列存储时元素(B)的起始地址一样。A. N24 B. N34C. N35 D. N446. 设有数组Ai,j,数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开场顺序存放,当以列为主序存放时,元素A5,8的存储首地址是(B)A. BA+141 B. BA+180C. BA+222 D. BA+2257. 递归过程或函数调用时,处理参数及返回地址,要用一种称为( C )的数据构造。A队列 B多维数组 C栈 D. 线性表 8. 关于单链表方式的队列,队空的条件是( A )AFRnil BFRCFnil且Rnil DRF19. 假设循环队列以数组Q0.m-1作为其存储构造,变量rear表示循环队列中的队尾元素的实际位置,其挪动按 rear=(rear+1) Mod m 进展,变量length表示当前循环队列中的元素个数,则循环队列的队首元素的实际位置是( C )Arear-lengthB(rear-length+m) Mod mC(1+rear+m-length) Mod mDM-length(二)应用题1、(10分)假设一个准对角矩阵按以下方式存储于一维数组B4m中:01234k4m24m1.写出由一对下标(i,j)表示的k的转换公式。答:i为奇数时 k=i+j-2i为偶数时 k=i+j-1合并后可写成 k=i+j-(i%2)-1 或 k=2(i/2)+j-12、特别矩阵和稀疏矩阵哪一种压缩存储后失去随机存取的功能?为什么?答:特别矩阵指值一样的元素或零元素在矩阵中的分布有一定规律,因而能够对非零元素分配单元(对值一样元素只分配一个单元),将非零元素存储在向量中,元素的下标i和j和该元素在向量中的下标有一定规律,能够用简单公式表示,仍具有随机存取功能。而稀疏矩阵是指非零元素和矩阵容量相比特别小(t<<m*n),且分布没有规律。用十字链表作存储构造自然失去了随机存取的功能。即便用三元组表的顺序存储构造,存取下标为i和j的元素时,要三元组表,下标不同的元素,存取时间也不同,最好情况下存取时间为O(1),最差情况下是O(n),因而也失去了随机存取的功能。3、有人说,采纳循环链表作为存储构造的队列确实是循环队列,你认为这种说法对吗?说明你的理由。答:这种说法是错误的。队列(包括循环队列)是一个逻辑概念,而链表是一个存储概念,一个队列是否是循环队列。不取决于它将采纳何种存储构造。依照实际的需要,循环队列能够采纳顺序存储构造,也能够采纳链式存储构造,包括采纳循环链表作为存储构造。4、指出以下程序段的功能是什么? (1) void demo1(seqstack *s) int I;arr64;n=0; while (!stackempty(s) arrn+=pop(s); for(I=0;<n;I+) push(s,arrI); (2) void demo2(seqstack *s,int m) seqstack t; int i; initstack(t);while(! Stackempty(s) if(I=pop(s)!=m) push(t,I);while(! Stackempty(t) i=pop(t); push(s,I);(三)算法设计题1 试利用循环队列编写求k阶斐波那契序列中前n+1项()的算法,要求满足且,其中max为某个商定的常数。循环队列的容量为k,因而,在算法执行完毕时,留在循环队列中的元素应是所求k阶斐波那契序列中的最后k项。答:void GetFib(int k,int n)InitQueue(Q);for(i=0;k<k-1;i+)Q.basei=0;Q.basek-1=1;for(i=0;i<k;i+)printf(“%d”,Q.basei);for(i=k;i<=n;i+)m=i%k;sum=0;for(j=0;j<k;j+)sum+=Q.base(m+j)%k;Q.basem=sum;printf(“%d”,sum);2. 已经明白num为无符号十进制整数,请写一非递归算法,该算法输出num对应的r进制的各位数字。要求算法中用到的栈采纳线性链表存储构造(1<r<10)。 解:typedef struct nodeint data;struct node *next;link;void trans(int num,int r) link *head=NULL,*s; int n; while (num>0) n=num%r; s=(link *)malloc(sizeof(link); s->data=n; s->next=head;head=s; num=num/r; printf(“输出r进制的各位数字:”); s=head; while (s!=NULL) printf(“%d”,s->data); s=s->next; 三、树与二叉树大纲要求:(一) 树的概念 (二) 二叉树 1. 二叉树的定义及其主要特征 2. 二叉树的顺序存储构造和链式存储构造 3. 二叉树的遍历 4. 线索二叉树的根本概念和构造 5. 二叉排序树 6. 平衡二叉树 (三) 树、森林 1. 树的存储构造 2. 森林与二叉树的转换 3. 树和森林的遍历 (四) 树的应用 1. 等价类咨询题 2. 哈夫曼(Huffman)树和哈夫曼编码 知识点:1. 二叉树的概念、性质(1)掌握树和二叉树的定义。(2)理解二叉树与一般双分支树的区别。二叉树是一种特别的树,这种特别不仅仅在于其分支最多为2以及其它特征,一个最重要的特别之处是在于:二叉树是有序的。即二叉树的左右小孩是不可交换的,假如交换了就成了另外一棵二叉树,如此交换之后的二叉树与原二叉树是不一样的两棵二叉树。但是,关于一般的双分支树而言,不具有这种性质。(3)满二叉树和完全二叉树的概念。(4)重点掌握二叉树的五个性质及证明方法,并把这种方法推行到K叉树。一般二叉树的五个性质:第i层的最多结点数,深度为k的二叉树的最多结点数,n0=n2+1的性质,n个结点的完全二叉树的深度,顺序存储二叉树时小孩结点与父结点之间的换算关系(序号i结点的左小孩为:2*i,右小孩为:2*i+1)。2. 掌握二叉树的顺序存储构造和二叉链表、三叉链表存储构造的各自优缺点及适用场合,以及二叉树的顺序存储构造和二叉链表存储构造的互相转换的算法。3. 纯熟掌握二叉树的先序,中序和后序遍历算法以及按层次遍历二叉树的先序、中序和后序三种遍历算法,划分的依照是视其每个算法中对根结点数据的访咨询顺序而定。不仅要纯熟掌握这三种遍历的递归算法,理解其执行的实际步骤,同时应该纯熟掌握三种遍历的非递归算法。按层次遍历二叉树void LayerOrder(Bitree T)/层序遍历二叉树 InitQueue(Q); /建立工作队列 EnQueue(Q,T); while(!QueueEmpty(Q) DeQueue(Q,p);visit(p);if(p->lchild) EnQueue(Q,p->lchild);if(p->rchild) EnQueue(Q,p->rchild); /LayerOrder 4. 遍历是根底,重点掌握在三种根本遍历算法的根底上实现二叉树的其它算法如求二叉树叶子结点总数,求二叉树结点总数,求度为1或度为2的结点总数,复制二叉树,建立二叉树,交换左右子树,查找值为n的某个指定结点,删除值为n的某个指定结点等等。5. 线索二叉树的引出,是为防止如二叉树遍历时的递归求解。递归尽管方式上比拟好理解,但是耗费了大量的内存资源,假如递归层次一多,势必带来资源耗尽的危险。二叉树线索化的本质是建立结点在相应序列中与其前驱和后继之间的直截了当联络。关于线索二叉树,应该掌握:线索化的本质,三种线索化的算法,线索化后二叉树的遍历算法,根本线索二叉树的其它算法咨询题(如:查找某一类线索二叉树中指定结点的前驱或后继结点)。6. 二叉排序树的中序遍历结果是一个递增的有序序列。二叉排序树的形态取决于元素的输入顺序,二叉排序树在最差情况下构成单支树。纯熟掌握其建立、查找、插入和删除算法,以及推断某棵二叉树是否二叉排序树这一咨询题的递归与非递归算法。7. 平衡二叉树是二叉排序树的优化,平衡二叉树对左右子树的深度有了限定:深度之差的绝对值不得大于1。掌握平衡二叉树的四种调整算法。8. 树与森林的遍历,只有两种遍历算法:先根与后根(关于森林而言称作:先序与中序遍历)。二者的先根与后根遍历与二叉树中的遍历算法是有对应关系的:先根遍历对应二叉树的先序遍历,而后根遍历对应二叉树的中序遍历。二叉树使用二叉链表分别存放它的左右小孩,树利用二叉链表存储小孩及兄弟(称小孩兄弟链表),而森林也是利用二叉链表存储小孩及兄弟。掌握树、森林和二叉树间的互相转换。9. 简单掌握等价类的生成算法。10. 哈夫曼树为理处理特定咨询题引出的特别二叉树构造,它的前提是给二叉树的每条边给予了权值,如此构成的二叉树按权相加之和是最小的,一般来说,哈夫曼树的形态不是唯一的。理解哈夫曼编码的根本原理,掌握基于哈夫曼树生成哈夫曼编码的方法。练习题:(一)选择题:1. 一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历结果为(A)A. CBEFDA B. FEDCBAC. CBEDFA D. 不确定2. 某二叉树的后序遍历序列为dabec,中序遍历序列为debac,则前序遍历序列为(D)。Aacbed Bdecab Cdeabc Dcedba3. 具有10个叶子结点的二叉树中有(B)个度为2的结点。A. 8 B. 9C. 10 D. 114. 树中所有结点的度等于所有结点数加( C )。A0 B1 C1 D25. 设n,m为一棵二叉树的两个结点,在中序遍历时,n在m前的条件是( C )A. n在m的右方 B. n是m的祖先C. n在m的左方 D. n是m的子孙6. 利用逐点插入建立序列(50,72,43,85,75,20,35,45,65,30)对应的二叉排序树以后,要查找元素30要进展( B )次元素间的比拟。A4 B. 5C6 D. 77. 在平衡二叉树中,( C )。A任意结点的左、右子树结点数目一样B任意结点的左、右子树高度一样C任意结点的左右子树高度之差的绝对值不大于1D不存在度为1的结点8. 由元素序列(27,16,75,38,51)构造平衡二叉树,则初次出现的最小不平衡子树的根(即离插入结点最近且平衡因子的绝对值为2的结点)为( D )A27 B38C51 D. 759. 在二叉树的顺序存储中,每个结点的存储位置与其父结点、左右子树结点的位置都存在一个简单的映射关系,因而可与三叉链表对应。假设某二叉树共有n个结点,采纳三叉链表存储时,每个结点的数据域需要d个字节,每个指针域占用4个字节,假设采纳顺序存储,则最后一个结点下标为k(起始下标为1),那么( A )时采纳顺序存储更节约空间。Ad<12n/(k-n) B. d>