1、树习题课,一、请判断正误,( )1. 若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n1个非空指针域。 ( )2.二叉树中每个结点的两棵子树的高度差等于1。 ( )3.二叉树中每个结点的两棵子树是有序的。 ( )4.二叉树中每个结点有两棵非空子树或有两棵空子树。 ( )5.二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子树(若存在的话)所有结点的关键字值。 1、3正确。,( )6.二叉树中所有结点个数是2k-1-1,其中k是树的深度。 ( )7.二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。 ( )8.对于一棵非空二叉树,
2、它的根结点作为第一层,则它的第i层上最多能有2i1个结点。 ( )9.用二叉链表法(link-rlink)存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。 (正确。用二叉链表存储包含n个结点的二叉树,结点共有2n个链域。由于二叉树中,除根结点外,每一个结点有且仅有一个双亲,所以只有n-1个结点的链域存放指向非空子女结点的指针,还有n+1个空指针。)即有后继链接的指针仅n-1个。 ( )10. 具有12个结点的完全二叉树有5个度为2的结点。 最快方法:用叶子数n/26,再求n2=n0-1=5,( ) 11.如果根结点的左子树和右子树高度差不超过1,则该二叉树是平衡二叉树。 (
3、 )12. 二叉树中不可能有两个结点在先根、中根和后根序列中的相对次序都不变。 12正确。,二、填空,1 . 由个结点所构成的二叉树有 种形态。 2 .一棵深度为6的满二叉树有 个分支结点和 个叶子。 3 .一棵具有个结点的完全二叉树,它的深度为 。 4. 设一棵完全二叉树有700个结点,则共有 个叶子结点。 5. 设一棵完全二叉树具有1000个结点,则此完全二叉树有 个叶子结点,有 个度为2的结点,有 个结点只有非空左子树,有 个结点只有非空右子树。 .5 . 31 32 . . 350 . 500 、499 、 1 、 0,6.一棵含有n个结点的k叉树,可能达到的最大深度为 ,最小深度为
4、。 7. 若已知一棵二叉树的前序序列是BEFCGDH,中序序列是FEBGCHD,则它的后序序列必是 。 8.中序遍历的递归算法平均空间复杂度为 。 9. 用5个权值3, 2, 4, 5, 1构造的哈夫曼(Huffman)树的带权路径长度是 。 . n 、 2 . F E G H D C B . O(n)即递归最大嵌套层数,即栈的占用单元数。 . 33,三、选择题,( )1 不含任何结点的空树 。 ()是一棵树; ()是一棵二叉树; ()是一棵树也是一棵二叉树; ()既不是树也不是二叉树 ( )2二叉树是非线性数据结构,所以 。 ()它不能用顺序存储结构存储; ()它不能用链式存储结构存储; (
5、)顺序存储结构和链式存储结构都能存储; ()顺序存储结构和链式存储结构都不能使用 . C . C,( )3. 具有n(n0)个结点的完全二叉树的深度为 。 () log2(n) () log2(n) () log2(n) +1 () log2(n)+1 ( )4把一棵树转换为二叉树后,这棵二叉树的形态是 。 ()唯一的 ()有多种 ()有多种,但根结点都没有左孩子 ()有多种,但根结点都没有右孩子 . C .,5. 树是结点的有限集合,它 A 根结点,记为T。其余的结点分成为m(m0)个 B 的集合T1,T2,Tm,每个集合又都是树,此时结点T称为Ti的父结点,Ti称为T的子结点(1im)。一
6、个结点的子结点个数为该结点的 C 。 供选择的答案 A:有0个或1个 有0个或多个 有且只有1个 有1个或1个以上 B:互不相交 允许相交 允许叶结点相交 允许树枝结点相交 C:权 维数 度数 序 答案:A= B= C= 1,1,3,6. 二叉树 A 。在完全的二叉树中,若一个结点没有 B ,则它必定是叶结点。每棵树都能惟一地转换成与它对应的二叉树。由树转换成的二叉树里,一个结点N的左子女是N在原树里对应结点的 C ,而N的右子女是它在原树里对应结点的 D 。 供选择的答案 A:是特殊的树 不是树的特殊形式 是两棵树的总称 是只有二个根结点的树形结构 B:左子结点 右子结点 左子结点或者没有右
7、子结点 兄弟 CD: 最左子结点 最右子结点 最邻近的右兄弟 最邻近的左兄弟 最左的兄弟 最右的兄弟 答案:A= B= C= D 2,1,1,3,. 哈夫曼树的带权路径长度是什么? ( ) 所有结点权值之和 所有叶结点带权路径长度之和 C. 权结点的值 D. 除根以外所有结点权值之和 . 已给如下二叉树,按先序遍历的结果是什么? ( ) A12354 B. 12345 C. 21435 D. 24531,9. 设在二叉排序树上要删除P指向的节点,且设f指向P的父结点,P为f的左孩子,P结点只有左子树,无右子树,那么应做的操作是什么? ( ) A f-lchild=null B. f-lchil
8、d=p-lchild C.f-lchild=p-rchild D. 都不是,10.考虑具有如下性质的二叉树:除叶子结点外,每个结点的值都大于其左子树上的一切结点的值。并小于等于其右子树上的一切结点的值。现把9个数1,2,3,8,9填入下图所示的二叉树的9个结点中,并使之具有上述性质。此时,n1的值是 A ,n2的值是 B ,n9的值是 C 。现欲把3.5放入此树并使该树保持前述性质,增加的一个结点可以放在 D 或 E 。供选择的答案AC: 1 2 3 4 5 6 7 8 9 DE: n7下面 n8下面 n9下面 n6下面 n1与n2之间 n2与n4之间 n6与n9之间 n3与n6之间 答案:A
9、 B C D E ,11.折半搜索与二叉搜索树的时间性能 相同 B. 完全不同 C. 有时不相同 D. 数量级都是O(log2n) 12.在二叉排序树中,每个结点的关键码值 A , B 一棵二叉排序,即可得到排序序列。 供选择的答案 A:比左子树所有结点的关键码值大,比右子树所有结点的关键码值小 比左子树所有结点的关键码值小,比右子树所有结点的关键码值大比左右子树的所有结点的关键码值都大与左子树所有结点的关键码值和右子树所有结点的关键码值无必然的大小关系 B:前序遍历 中序(对称)遍历 后序遍历 层次遍历 11.C 12. ,四、简答题,1.一棵度为2的树与一棵二叉树有何区别? 答:度为2的树
10、从形式上看与二叉树很相似,但它的子树是无序的,而二叉树是有序的。即,在一般树中若某结点只有一个孩子,就无需区分其左右次序,而在二叉树中即使是一个孩子也有左右之分。,2.简述由任意二叉树B的前序遍历序列和中序遍历序列求二叉树B的思想方法。 3.简述最大(小)堆插入、删除方法。 4.简述最大(小)堆建立方法。 5.简述哈夫曼树的构造方法。 6.简述集合的并运算过程。,五、分析题,1. 从空树起,依次插入关键字37,50,42,18,48,12,56,30,23,构造一棵二叉排序树。 (1)画出该二叉排序树。 (2)画出从(1)中所得树删除关键字为37的结点之后的二叉树。,2.在一棵空的二叉查找树中
11、依次插入关键字序列为12,7,17,11,16,2,13,9,21,4,请画出所得到的二叉查找树。验算方法: 用中序遍历应得到排序结果: 2,4,7,9,11,12,13,16,17,21,3.给定表(19,14,22,01,66,21,83,27,56,13,10)。 (1)试按元素在表中的次序将它们依次插入一棵初始时为空的二叉排序树,画出插入完成之后的二叉排序树。 (2)按表中元素顺序构造一棵AVL树,并求其在等概率情况下查找成功的平均查找长度。 成功平均查找长度为: ASL=( 1 +2 * 2 + 3 * 4 + 4 * 4 ) / 11 = 33 /11 = 3,4.设给定权集W=2
12、,3,4,7,8,10,试构造关于W的Huffman树;并求其各结点的Huffman编码。,2:1010 3:1011 4:100 7:00 8:01 10:11,六、算法题,1.试编写算法,在给定的二叉排序树上找出任意两个不同结点的最近公共祖先(若在两结点A、B中,A是B的祖先,则认为A、B的最近公共祖先就是A)。 分析:根据题目要求分下面情况进行讨论: 若A为根结点,则A为公共祖先; 若A-datadata且T-datadata,T为公共祖先; 若A-datadata且B-datadata或A-dataT-data且B-dataT-data,则到T的左右子树去查找。 bitreptr AN
13、S (bitreptr T,A,B) /*T为二叉排序树的根结点*/ if (T=NULL) return (NULL); /*不存在*/else if (A-datadata)/*到左子树上查找*/ ,2.试编写算法求出指定结点在给定的二叉排序树中所在的层数。 分析:采用递归方法,从根结点开始查找结点p,若查询结点是所要找的结点,返回其深度h0。否则,到左、右子树上去找,查找深度加1。 int find1 ( birtreptr T , p , int h0 ) /*在二叉树排序树T中查找结点p的层次,若不在时返回空值。h0为根结点T的层次*/ if ( p = NULL ) return
14、( 0 ) ; /* 没找到返回0 */if( p =T) return( h0 ) ; /* 找到 */else if (p - data data ) return( find1( T -lchild,p,h0) +1) ; /* 到左子树去找 */else return ( find1 ( T - rchild,p,h0) + 1); /* 到右子树去找 */ int find2( birtrptr T, p ) return ( find1 ( T, p,1 ) ) ; ,3试写一个判别给定二叉树是否为二叉排序树的算法,设此二叉树以二叉链表作存储结构。 分析:对二叉排序树来讲,其中根遍历序列为一个递增有序序列。因此,对给定的二叉树进行中根遍历,如果始终能保证前一个值比后一个值小,则说明该二叉树是二叉排序树。 int bsbtr (bitreptr T) /*predt记录当前结点前趋值,初值为-*/ if (T=NULL) return(1); else b1=bsbtr(T-lchild); /*判断左子树*/if (!b1 | (predt=T-data) return(0); /*当前结点和前趋比较*/predt=T-data; /*修改当前结点的前趋值*/return(bsbtr(T-rchild); /*判断右子树并返回最终结果*/ ,