第六章树及二叉树

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第六章树及二叉树一、判断正误1、完全二叉树中,若一个结点没有左孩子,则它必是叶子结点。(√)2、二叉树中每个结点的两棵子树的高度差等于1。(×)3、二叉树中每个结点的两棵子树是有序的。(√)4、二叉树中每个结点有两棵非空子树或有两棵空子树。(×)5、一棵树中的叶子数一定等于与其对应的二叉树的叶子数。(×)6、二叉树是度为2的有序树。(×)7、二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。(×)8、线索二叉树的优点是便于在中序下查找前驱结点和后继结点。(√)9、树与二叉树是两种不同的树型结构。(√)10、哈夫曼树是带权路径最短的树,路径上权值较大的结点离根较近。(√)11、一棵一般树的结点的前序遍历和后序遍历分别与它相应二叉树的结点前序遍历和后序遍历是一致的。(×)12、在哈夫曼树中,权值最小的结点离根结点最近。(×)13、对一棵二叉树进行层次遍历时,应借助于一个栈。(×)14、深度为K的完全二叉树至少有2K-1个结点。(√)15、具有n个结点的满二叉树,其叶结点的个数为(n+1)/2。(√)16、二叉树中每个结点有两个子结点,而树无此限制,因此二叉树是树的特殊情况。(×)17、完全二叉树一定存在度为1的结点。(×)18、二叉树的遍历只是为了在应用中找到一种线性次序。(√)19、二叉树的叶子结点在前序遍历和后序遍历下,皆以相同的相对位置出现。(√)20、用一维数组存储二叉树时,总是以前序遍历顺序存储结点。(×)二、填空1、二叉树由根结点、左子树、右子树_三个基本单元组成。2、在二叉树中,指针p所指结点为叶子结点的条件是p-lchild==null&&p-rchlid==null。3、一棵具有257个结点的完全二叉树,它的深度为9。4、某二叉树有20个叶子结点,有30个结点仅有一个孩子,则该二叉树的总结点数为_69_。(20+(20-1)+30)5、设一棵完全二叉树具有1000个结点,则此完全二叉树有500个叶子结点,有499个度为2的结点,有1个结点只有非空左子树,有0个结点只有非空右子树。6、一棵含有n个结点的k叉树,可能达到的最大深度为n,最小深度为2。7、若已知一棵二叉树的前序序列是BEFCGDH,中序序列是FEBGCHD,则它的后序序列必是FEGHDCB。8、具有256个结1`点的完全二叉树的深度为__9___。9、高度为8的完全二叉树至少有__64___个叶子结点。(2ˆ7-1+1)/210、N个结点的二叉树采用二叉链表存放,共有空链域个数为n+111、深度为6(根层次为1)的二叉树至多有26–1个结点。12、线索二元树的左线索指向其_前驱____,右线索指向其__后继___。三、选择题1、二叉树结点的中序序列为A、B、C、D、E、F、G,后序序列为B、D、C、A、F、G、E,则其左子树中结点数目为(C)A、3B、2C、4D、52、二叉树是非线性数据结构,所以(B)A、它不能用顺序存储结构存储;B、顺序存储结构和链式存储结构都能存储;C、它不能用链式存储结构存储;顺序存储结构和链式存储结构都不能使用3、有n(n0)个结点的完全二叉树的深度为(C)。A、log2(n)B、log2(n)C、log2(n)+1D、log2(n)+14、把一棵树转换为二叉树后,这棵二叉树的形态是(A)。A、唯一的B、有多种C、有多种,但根结点都没有左孩子D、有多种,但根结点都没有右孩子5、下述二叉树中,哪一种满足性质:从任一结点出发到根的路径上所经过的结点序列按其关键字有序(D)。A、二叉排序树B、哈夫曼树C、AVL树D、堆6、线索二叉树是一种(C)结构。A、逻辑B、逻辑和存储C、物理D、线性7、将一棵有100个结点的完全二叉树从根这一层开始,每一层从左到右依次对结点进行编号,根结点编号为1,则编号为49的结点的左孩子的编号为(A)A、98B、99C、50D、488、设森林F中有三棵树,第一、第二和第三棵树的结点个数分别为M1、M2和M3。与森林F对应的二叉树根结点的右子树上的结点个数是(D)A、M1B、M1+M2C、M3D、M2+M39、将一棵有100个结点的完全二叉树从根这一层开始,每一层从左到右依次对结点进行编号,根结点编号为1,则编号最大的非叶结点的编号为(C)A、48B、49C、50D、5110、引入二叉线索树的目的是(A)A、加快查找结点的前驱或后继的速度B、为了能在二叉树中方便的进行插入与删除C、为了能方便的找到双亲D、使二叉树的遍历结果唯一11、若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是(B)A、9B、11C、15D、不确定12、一棵树高为K的完全二叉树至少有(C)个结点A、2k–1B.2k-1–1C、2k-1D、2k`14、一棵二叉树的前序遍历序列为ABCDEFG,它的中序遍历序列可能是(B)A、CABDEFGB、ABCDEFGC、DACEFBGD、ADCFEG15、有关二叉树下列说法正确的是(B)A、二叉树的度为2B、一棵二叉树的度可以小于2C、二叉树中至少有一个结点的度为2D、二叉树中任何一个结点的度都为216、一个具有1025个结点的二叉树的高h为(C)A、11B、10C、11至1025之间D、10至1024之间17、一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有(B)结点A、2hB、2h-1C、2h+1D、h+118、对于有n个结点的二叉树,其高度为(D)A、nlog2nB、log2nC、log2n|+1D、不确定19、一棵具有n个结点的完全二叉树的树高度(深度)是(A)A、logn+1B、logn+1C、lognD、logn-120、已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历是(D)。A、acbedB、decabC、deabcD、cedba21、若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用(C)遍历方法最合适。A、前序B、中序C、后序D、按层次22、在下列存储形式中,哪一个不是树的存储形式?(D)A、双亲表示法B、孩子链表表示法C、孩子兄弟表示法D、顺序存储表示法23、在下列关于二叉树的叙述中,正确的是(D)①只有一个结点的二叉树度为0;②二叉树的度为2;③二叉树的左右子树可任意交换;④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。A、①②③B、②③④C、②④D、①④24、若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则x的前驱为(C)A、X的双亲B、X的右子树中最左的结点C、X的左子树中最右结点D、X的左子树中最右叶结点25、在二叉树结点的先序序列,中序序列和后序序列中,所有叶子结点的先后顺序(B)A、都不相同B、完全相同C、先序和中序相同而与后序不同D、中序和后序相同,而与先序不同。26、在线索化二叉树中,t所指结点没有右子树的充要条件是()。A、t-Rtag==1B、t-Rchild==NULLC、t-Rtag==1且t-Rchild==NULLD、以上都不对27、设给定权值总数有n个,其哈夫曼树的结点总数为(D)A、不确定B、2nC、2n+1D、2n-128、利用二叉链表存储树,则根结点的右指针是(C)。A、指向最左孩子B、指向最右孩子C、空D、非空29、在下列存储形式中,(D)不是树的存储形式。A、双亲表示法B、孩子链表表示法C、孩子兄弟表示法D、顺序存储表示法30、一棵非空二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足(C)。A、所有的结点均无左孩子B、所有的结点均无右孩子C、只有一个叶子结点D、是任意一棵二叉树四、简答题1、给定二叉树的两种遍历序列,分别是:前序遍历序列:D,A,C,E,B,H,F,G,I;中序遍历序列:D,C,B,E,H,A,G,I,F,试画出二叉树B。解:方法是:由前序先确定root,由中序可确定root的左、右子树。然后由其左子树的元素集合和右子树的集合对应前序遍历序列中的元素集合,可继续确定root的左右孩子。将他们分别作为新的root,不断递归,则所有元素都将被唯一确定,问题得解。2、已知一棵二叉树,其中序序列DBCAFGE,后序序列DCBGFEA,构造该二叉树。解:3、给定权值{8,12,4,5,26,16,9},构造一棵带权路径长度最短的二叉树,并计算其带权路径长度。解:或:WPL=8×3+4×4+5×4+16×2+9×3+12×3+26×2=207[注]:哈夫曼树的左右子树可以互换。4、(把如图所示的树转化成二叉树。答:注意全部兄弟之间都要连线(包括度为2的兄弟),并注意原有连线结点一律归入左子树,新添连线结点一律归入右子树。ABECKFHDLGIMJ5、画出和下列二叉树相应的森林。答:注意根右边的子树肯定是森林,而孩子结点的右子树均为兄弟。五、算法设计题1、编写递归算法,计算二叉树中叶子结点的数目。解:思路:输出叶子结点比较简单,用任何一种遍历递归算法,凡是左右指针均空者,则为叶子,将其打印出来。voidLeaf(BitTreebt,int*count){if(bt){Leaf(bt-lchild,&count);//计算左子树的叶子结点个数if(bt-lchild==NULL&&bt-rchild==NULL)(*count)++;Leaf(bt-rchild,&count);//计算右子树的叶子结点个数}}2.写出求二叉树深度的算法,先定义二叉树的抽象数据类型。解:intdepth(liuyu*root)/*统计层数*/{intd,p;/*注意每一层的局部变量d,p都是各自独立的*/p=0;if(root==NULL)return(p);/*找到叶子之后才开始统计*/else{d=depth(root-lchild);if(dp)p=d;/*向上回朔时,要挑出左右子树中的相对大的那个深度值*/d=depth(root-rchild);if(dp)p=d;}p=p+1;return(p);}3、求二叉树中以元素值为x的结点为根的子树的深度。解:intGet_Sub_Depth(BitreeT,intx)//求二叉树中以值为x的结点为根的子树深度{if(T-data==x){printf(%d\n,Get_Depth(T));//找到了值为x的结点,求其深度exit1;}}else{if(T-lchild)Get_Sub_Depth(T-lchild,x);if(T-rchild)Get_Sub_Depth(T-rchild,x);//在左右子树中继续寻找}}//Get_Sub_Depth4、编写按层次顺序(同一层自左至右)遍历二叉树的算法。解:思路:既然要求从上到下,从左到右,则利用队列存放各子树结点的指针是个好办法。这是一个循环算法,用while语句不断循环,直到队空之后自然退出该函数。技巧之处:当根结点入队后,会自然使得左、右孩子结点入队,而左孩子出队时又会立即使得它的左右孩子结点入队,……以此产生了按层次输出的效果。voidLayerOrder(BitreeT)//层序遍历二叉树{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);}}//LayerOrder5、二叉树按二叉链表形式存储,编写算法判别给定二叉树是否为完全二叉树。答:intIsFull_Bitree(BitreeT)//判断二叉树是否完全二叉树,是则返回1,否则返回0{InitQueue(Q);flag=0;EnQueue(Q,T);//建立工作队列while(!QueueEmpty(Q)){{DeQueue(Q,p);if(!p)flag=1;elseif(flag)return0;else{EnQueue(Q

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功