数据结构习题.doc
数据结构习题选编 一、选择题 1.已知一算术表达式的中缀形式为 A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为( ) A.-A+B*C/DE B. -A+B*CD/E C.-+*ABC/DE D. -+A*BC/DE (2 分) 2.算术表达式a+b*(c+d/e)转为后缀表达式后为( ) A.ab+cde/* B.abcde/+*+ C.abcde++ 3. 设有一表示算术表达式的二叉树(见下图), 它所表示的算术表达式是( )(2 分) A. A*B+C/(D*E)+(F-G) B. (A*B+C)/(D*E)+(F-G) C. (A*B+C)/(D*E+(F-G)) D. A*B+C/D*E+F-G 4. 设树T 的度为4,其中度为1,2,3 和4 的结点个数分别为4,2,1,1 则T 中的叶子数为 ( ) A.5 B.6 C.7 D.8 (1.5 分) 5. 在下述结论中,正确的是( )(1 分) ①只有一个结点的二叉树的度为0; ②二叉树的度为2; ③二叉树的左右子树可任意交换; ④深度为K 的完全二叉树的结点个数小于或等于深度相同的满二叉树。 A.①②③ B.②③④ C.②④ D.①④ 6. 设森林F 对应的二叉树为B,它有m 个结点,B 的根为p,p 的右子树结点个数为n,森林F 中 第一棵树的结点个数是( ) A.m-n B.m-n-1 C.n+1 D.条件不足,无法确定(1.5 分) 7. 树是结点的有限集合,它( (1))根结点,记为T。其余结点分成为m(m>0)个((2))的 集合T1,T2, …,Tm,每个集合又都是树,此时结点T 称为Ti 的父结点,Ti 称为T 的子 结点(1≤i≤m)。一个结点的子结点个数称为该结点的( (3) )。二叉树与树是两个不同 的概念,二叉树也是结点的有限集合,它((4))根结点。可以把树的根结点的层数定义为 1,其他结点的层数等于其父结点所在层数加上1。令T 是一棵二叉树,Ki 和Kj 是T 中子结 点数小于2 的结点中的任意两个,它们所在的层数分别为λKi 和λKj,当关系式 │λKi-λKj│≤1 一定成立时,则称T 为一棵((5))。供选择的答案: (1)(4) A. 有0 个或1 个 B. 有0 个或多个 C. 有且只有一个 D. 有1 个或1 个以上 (2) A. 互不相交 B.允许相交 C.允许叶结点相交 D.允许树枝结点相交 (3) A. 权 B.维数 C.次数 D.序 (5) A. 丰满树 B.查找树 C.平衡树 D.完全树 (5 分) 8.若一棵二叉树具有10 个度为2 的结点,5 个度为1 的结点,则度为0 的结点个数是( ) A.9 B.11 C.15 D.不确定 (3 分) 9.在一棵三元树中度为3 的结点数为2 个,度为2 的结点数为1 个,度为1 的结点数为2 个, 则度为0的结点数为( )个 A.4 B.5 C.6 D.7 (2 分) 10.设森林F 中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2 和M3。与森林F 对应的二叉树根结点的右子树上的结点个数是( )。(2 分) A.M1 B.M1+M2 C.M3 D.M2+M3 11.具有10 个叶结点的二叉树中有( )个度为2 的结点,(2 分) A.8 B.9 C.10 D.ll 12.一棵完全二叉树上有1001 个结点,其中叶子结点的个数是( )(3 分) A. 250 B. 500 C.254 D.505 E.以上答案都不对 13. 设给定权值总数有n 个,其哈夫曼树的结点总数为( ) (2 分) A.不确定 B.2n C.2n+1 D.2n-1 14. 有n 个叶子的哈夫曼树的结点总数为( )。(2 分) A.不确定 B.2n C.2n+1 D.2n-1 15.若度为m 的哈夫曼树中,其叶结点个数为n,则非叶结点的个数为( )。(2 分) A.n-1 B.−n/m−-1 C.−(n-1)/(m-1)−D. −n/(m-1)−-1 E.−(n+1)/(m+1)−-1 16. 有关二叉树下列说法正确的是( )(1.5 分) A.二叉树的度为2 B.一棵二叉树的度可以小于2 C.二叉树中至少有一个结点的度为2 D.二叉树中任何一个结点的度都为2 17.二叉树的第I 层上最多含有结点数为( )(2 分) A.2I B. 2I-1-1 C. 2I-1 D.2I -1 18. 一个具有1025 个结点的二叉树的高h 为( )(2 分) A.11 B.10 C.11 至1025 之间 D.10 至1024 之间 19.一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有( )结点 A.2h B.2h-1 C.2h+1 D.h+1 (1.5 分) 20.对于有n 个结点的二叉树, 其高度为( )(4 分) A.nlog2n B.log2n C.−log2n−|+1 D.不确定 21. 一棵具有 n 个结点的完全二叉树的树高度(深度)是( ) (2 分) A.−logn−+1 B.logn+1 C.−logn−D.logn-1 22.深度为h 的满m 叉树的第k 层有( )个结点。(1==1)。(2 分) 31.必须把一般树转换成二叉树后才能进行存储。(1 分) 32.完全二叉树的存储结构通常采用顺序存储结构。(1 分) 33.将一棵树转成二叉树,根结点没有左子树;(2 分) 34.在二叉树中插入结点,则此二叉树便不再是二叉树了。(1 分) 35.二叉树是一般树的特殊情形。(1 分) 36.树与二叉树是两种不同的树型结构。(1 分) 37. 非空的二叉树一定满足:某结点若有左孩子,则其中序前驱一定没有右孩子 (1 分) 38.在任意一棵非空二叉排序树,删除某结点后又将其插入,则所得二叉排序树与删除前原 二叉排序树相同。(1 分) 39.度为二的树就是二叉树。(1 分) 40.深度为k 具有n 个结点的完全二叉树,其编号最小的结点序号为 −2k-2−+1。(2 分)】 41.下面二叉树的定义只有一个是正确的,请在正确的地方画“√”。 (1)它是由一个根和两株互不相交的、称为左子树和右子树的二叉树组成。 (2)(a)在一株二叉树的级i 上,最大结点数是2i-1(i≥1) (b)在一棵深度为k 的二叉树中,最大结点数是2k-1+1(k≥1)。 (3)二叉树是结点的集合,满足如下条件: (a)它或者是空集; (b)或者是由一个根和两个互不相交的、称为左子树和右子树的二叉树组成。(6 分) 42. 在中序线索二叉树中,每一非空的线索均指向其祖先结点。 (1 分) 43. 线索二叉树的优点是便于是在中序下查找前驱结点和后继结点。(1 分) 44. 二叉树中序线索化后,不存在空指针域。(1 分) 45.霍夫曼树的结点个数不能是偶数。(1 分) 46. 一棵哈夫曼树的带权路径长度等于其中所有分支结点的权值之和。 (1 分) 47. 哈夫曼树无左右子树之分。(1 分) 48.当一棵具有n 个叶子结点的二叉树的WPL 值为最小时,称其树为Huffman 树,且其二叉 树的形状必是唯一的。(1 分) 49.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。(2 分) 50. 用链表(llink-rlink)存储包含n 个结点的二叉树时,结点的2n 个指针区域中有n+1 个空指针。( )(1 分) 三、填空题 1.二叉树由_(1)__,__(2)_,_(3)__三个基本单元组成。(3 分) 2.树在计算机内的表示方式有_(1)__,_(2)__,_(3)__。(3 分) 3.在二叉树中,指针p 所指结点为叶子结点的条件是______。(2 分) 4.中缀式a+b*3+4*(c-d)对应的前缀式为__(1)_, 若a=1,b=2, c=3, d=4,则后缀式db/cc*a-b*+ 的运算结果为_(2)__。 5.二叉树中某一结点左子树的深度减去右子树的深度称为该结点的____。(1 分) 6.具有256 个结点的完全二叉树的深度为______。(1 分) 7.已知一棵度为3 的树有2 个度为1 的结点,3 个度为2 的结点,4 个度为3 的结点,则该树 有______个叶子结点。(3 分) 8.深度为k 的完全二叉树至少有___(1)____个结点,至多有___(2)____个结点。(4 分) 9.深度为H 的完全二叉树至少有_(1)__个结点;至多有_(2)__个结点;H 和结点总数N 之 间的关系是(3)__。 (4 分) 10.在顺序存储的二叉树中,编号为i 和j 的两个结点处在同一层的条件是______。(4 分) 11.在完全二叉树中,编号为i 和j 的两个结点处于同一层的条件是______。(2 分) 12.一棵有n 个结点的满二叉树有__(1)_个度为1 的结点、有__(2)_个分支 (非 终端)结 点和__(3)_个叶子,该满二叉树的深度为_(4)__。(3 分) 13.假设根结点的层数为1,具有n个结点的二叉树的最大高度是______。 14.在一棵二叉树中,度为零的结点的个数为N0,度为2 的结点的个数为N2,则有N0 =______ (2 分) 15.设只含根结点的二叉树的高度为0,则高度为k 的二叉树的最大结点数为______,最小结 点数为______。(4 分) 16.设有N 个结点的完全二叉树顺序存放在向量A[1:N]中,其下标值最大的分支结点为 ______。(2 分) 17.高度为K 的完全二叉树至少有______个叶子结点。(2 分) 18.高度为8 的完全二叉树至少有______个叶子结点。(2 分) 19.已知二叉树有50 个叶子结点,则该二叉树的总结点数至少是______。(4 分) 20.一个有2001 个结点的完全二叉树的高度为______。(1 分) 21.设F 是由T1,T2,T3 三棵树组成的森林,与F 对应的二叉树为B,已知T1,T2,T3 的结点数分 别为n1,n2和n3 则二叉树B 的左子树中有__(1)_个结点,右子树中有_(2)__个结点。(3 分) 22.一个深度为k 的,具有最少结点数的完全二叉树按层次,(同层次从左到右)用自然数 依此对结点编号,则编号最小的叶子的序号是__(1)_;编号是i 的结点所在的层次号是 _(2)__(根所在的层次号规定为1 层)。(2 分) 23.如某二叉树有20 个叶子结点,有30 个结点仅有一个孩子,则该二叉树的总结点数为 ______。(2 分) 24.如果结点A 有 3 个兄弟,而且B 是A 的双亲,则B 的度是______。(2 分) 25.高度为h 的2-3 树中叶子结点的数目至多为______。(2 分) 26.完全二叉树中,结点个数为n,则编号最大的分支结点的编号为______。(2 分) 27.设一棵完全二叉树叶子结点数为k,最后一层结点数>2,则该二叉树的高度为______。 28.对于一个具有n 个结点的二元树,当它为一棵_(1)_二元树时具有最小高度,当它为一 棵_(2)_时,具有最大高度。(2 分) 29.具有N 个结点的二叉树,采用二叉链表存储,共有______个空链域。 30.8 层完全二叉树至少有______个结点,拥有100 个结点的完全二叉树的最大层数为 ______。 31.含4 个度为2 的结点和5 个叶子结点的二叉树,可有______个度为1 的结点。 (2 分) 32.一棵树T 中,包括一个度为1 的结点,两个度为2 的结点,三个度为3 的结点,四个度 为4 的结点和若干叶子结点,则T 的叶结点数为______。(2 分) 33. n(n 大于1)个结点的各棵树中,其深度最小的那棵树的深度是_(1)__。它共有_(2)__ 个叶子结点和_(3)__个非叶子结点,其中深度最大的那棵树的深度是_(4)__,它共有_(5)__ 个叶子结点和_(6)__个非叶子结点。(2 分) 34. 每一棵树都能唯一的转换为它所对应的二叉树。若已知一棵二叉树的前序序列是 BEFCGDH,对称序列是FEBGCHD,则它的后序序列是_(1)__。设上述二叉树是由某棵树转换而 成,则该树的先根次序序列是_(2)__。(6 分) 35.先根次序周游树林正好等同于按_(1)__周游对应的二叉树,后根次序周游树林正好等同 于按__(2)_周游对应的二叉树。(4 分) 36.二叉树结点的对称序序列为A,B,C,D,E,F,G,后序序列为B,D,C,A,F,G,E,则该二叉树结点 的前序序列为_(1)__,则该二叉树对应的树林包括_(2)__棵树。(4 分) 37.二叉树的先序序列和中序序列相同的条件是______。(2 分) 38. 已知一棵二叉树的前序序列为abdecfhg,中序序列为dbeahfcg,则该二叉树的根为_(1)__, 左子树中有_(2)__, 右子树中有_(3)__。(6 分) 39.设二叉树中每个结点均用一个字母表示,若一个结点的左子树或右子树为空,用 .表 示,现前序遍历二叉树,访问的结点的序列为ABD.G...CE.H..F..,则中序遍历二叉树时, 访问的结点序列为_(1)__;后序遍历二叉树时,访问的结点序列为_(2)__。(4 分) 40.已知二叉树前序为ABDEGCF,中序为DBGEACF,则后序一定是____。(2 分) 41.现有按中序遍历二叉树的结果为abc,问有_(1)__种不同的二叉树可以得到这一遍历结 果,这些二叉树分别是_(2)__。(3 分) 42.一个无序序列可以通过构造一棵______树而变成一个有序序列,构造树的过程即为对无 序序列进行排序的过程。(2 分) 43.利用树的孩子兄弟表示法存储,可以将一棵树转换为______。 44.若一个二叉树的叶子结点是某子树的中序遍历序列中的最后一个结点,则它必是该子树 的______序列的最后一个结点。 45.先根次序周游树林正好等同于按______周游对应的二叉树;后根次序周游树林正好等同 于______周游对应的二叉树。(4分) 46. 在一棵存储结构为三叉链表的二叉树中,若有一个结点是它的双亲的左子女,且它的双 亲有右子女,则这个结点在后序遍历中的后继结点是______。(2 分) 47.一棵左子树为空的二叉树在先序线索化后,其中的空链域的个数为:______。 (4 分) 48.具有n 个结点的满二叉树,其叶结点的个数是______。 49.设一棵后序线索树的高是50,结点x 是树中的一个结点,其双亲是结点y,y 的右子树高 度是31,x 是y 的左孩子。则确定x 的后继最多需经过______中间结点(不含后继及x 本身) (1.5 分) 50.线索二元树的左线索指向其______,右线索指向其______。 (2 分) 51.设y 指向二叉线索树的一叶子,x 指向一待插入结点,现x 作为y 的左孩子插入,树中 标志域为ltag和rtag,并规定标志为1 是线索,则下面的一段算法将x 插入并修改相应的线 索,试补充完整:(lchild,rchild 分别代表左,右孩子) x^.ltag:= (1)___; x^.lchild:= (2)___; y^.ltag:= (3)___; y^.lchild:= (4)___; x^.rtag:= (5)___; x^.rchild:= (6)___; IF (x^.lchild<>NIL) AND (x^lchild^.rtag=1) THEN x^.lchild^.rchild:= (7)___; (9 分) 52.哈夫曼树是______。(2 分) 53.若以{4,5,6,7,8}作为叶子结点的权值构造哈夫曼树,则其带权路径长度是______。 (4 分) 54.有数据WG={7,19,2,6,32,3,21,10},则所建Huffman 树的树高是_(1)__,带权 路径长度WPL为_(2)__。(4 分) 55.有一份电文中共使用 6 个字符:a,b,c,d,e,f,它们的出现频率依次为2,3,4,7,8,9,试构 造一棵哈夫曼树,则其加权路径长度WPL 为_(1)__,字符c 的编码是_(2)__。(3 分) 56.设n0 为哈夫曼树的叶子结点数目,则该哈夫曼树共有______个结点。(2 分) 57 . ① 二叉树用来表示表达式, 因为需要保存各子树的值, 修改二叉树的结点结构为 (Lchild,Data,Val,Rchild)。其中Lchild,Rchild 的意义同前,Val 用来存放以该结点为根 的子树的值,值的类型依具体情况而定。为了简便起见,算法假定所考虑的表达式只有+, -,*,/ 四种二目运算,且已表示成相应的二叉树。算法所计算的表达式值放在根结点的Val 域中。 PROC Postorder-eval(t:ptrType) BEGIN IF (t!=NULL) BEGIN (1)_______; (2)_______; CASE t^.data: ‘+’: t^.Val:=t^. Lchild^. Val + t^. Rchild ^. Val; BREAK; ‘-’: t^.Val:=t^. Lchild^. Val - t^. Rchild ^. Val; BREAK; ‘*’: t^.Val:=t^. Lchild^. Val * t^. Rchild ^. Val; BREAK; ‘/’: t^.Val:=t^. Lchild^. Val / t^. Rchild ^. Val; BREAK; otherwise: (3)___; BREAK; ENDCASE END END; ②PROC Delete(x:datatype,A:tree) BEGIN tempA:= (4)___; WHILE (tempA^.Item!=x) AND (tempA!=NULL) DO IF (xrchild=(2)___; (3)___=q; if(p->lchild) (4)___; if(p->rchild) (5)___; } } }// (10 分) 60.设t 是给定的一棵二叉树,下面的递归程序count(t)用于求得:二叉树t 中具有非空的 左,右两个儿子的结点个数N2;只有非空左儿子的个数NL;只有非空右儿子的结点个数NR 和 叶子结点个数N0。N2、NL、NR、N0 都是全局量,且在调用count(t)之前都置为0. typedef struct node {int data; struct node *lchild,*rchild;}node; int N2,NL,NR,N0; void count(node *t) {if (t->lchild!=NULL) if (1)___ N2++; else NL++; else if (2)___ NR++; else (3)__ ; if(t->lchild!=NULL)(4)____; if (t->rchild!=NULL) (5)____; } (10 分) 61.下面是求二叉树高度的类PASCAL(注:编者略)及类C 写的递归算法试补充完整 [说明](1)考生可根据自己的情况任选一个做(都选不给分) (2)二叉树的两指针域为lchild 与rchild, 算法中p 为二叉树的根,lh 和rh 分别为以p 为 根的二叉树的左子树和右子树的高,hi 为以p 为根的二叉树的高,hi 最后返回。 height(p) {if ((1)___) {if(p->lchild==null) lh=(2)_______; else lh=(3)_______; if(p->rchild==null) rh=(4)_______; else rh=(5)_______; if (lh>rh) hi=(6)__;else hi=(7)_______; } else hi=(8)_______; return hi; }// (15 分) 62.二叉树以链方式存储,有三个域,数据域data,左右孩子域lchild,rchild。树根由tree 指向 。现要求按层次从上到下,同层次从左到右遍历树。下面算法中用到addx(p),将指针 p 进队,delx( )将队头元素返回并退队,notempty 在队不空时返回true,否则为false,将 算法补充完整: PROC processnode(p); IF(1)_______THEN [write(p^.data); (2)_______ ] ENDP; PROC trave(tree); write(tree^.data); (3)_______; WHILE notempty() DO [ r:=delx( ); processnode(r^.lchild); processnode((4)_______)] ENDP; (4 分) 63 阅读下列程序说明和程序,填充程序中的______ 【程序说明】本程序完成将二叉树中左、右孩子交换的操作。交换的结果如下所示(编者 略)。 本程序采用非递归的方法,设立一个堆栈stack 存放还没有转换过的结点,它的栈顶指针为 tp。交换左、右子树的算法为: (1)把根结点放入堆栈。 (2)当堆栈不空时,取出栈顶元素,交换它的左、右子树,并把它的左、右子树分别入栈。 (3)重复(2)直到堆栈为空时为止。 typedef struct node *tree; struct node{int data; tree lchild,rchild;} exchange(tree t) {tree r,p; tree stack [500]; int tp=0; (1)_______ while (tp>=0) {(2)_______ if((3)_______) {r=p->lchild; p->lchild=p->rchild; p->rchild=r stack[(4)_______]=p->lchild; stack[++tp]=p->rchild; } }}(15 分) 64.下面使用类pascal 语言写的对二叉树进行操作的算法,请仔细阅读 TYPE pointer=^tnodetp; tnodetp=RECORD data: char; llink,rlink: pointer;END; linkstack=^linknodet; linknodet=RECORD data:pointer; next;linkstack;END; PROC unknown (VAR t:pointer); VAR p,temp:pointer; BEGIN p:=t; IF p<> NIL THEN [temp:=p^.llink ;p^.llink:=p^.rlink;;p^.rlink:=temp; unknown(p^.llink); unknown(p^.rlink); ] END; ① 指出该算法完成了什么功能 ② 用栈将以上算法改为非递归算法unknown1,其中有若干语句或条件空缺请在空缺处填写 上适当的语句或条件 PROC inistack(VAR s:linkstack); (1)_______; s^.next:=NIL; ENDP; FUNC empty (s:linkstack):boolean; IF (2)_______THEN empty:=true ELSE empty:=false; ENDF; FUNC gettop(s:linkstack):pointer; gettop:= (3)_______; ENDF; FUNC pop(VAR s:linkstack):pointer; VAR p:linkstack; pop:=s^.next^.data; p:=s^.next; (4)_______;(5)_______; ENDF; PROC push (VAR s:linkstack;x:pointer); VAR p:linkstack; new(p); p^.data:=x; (6)_______; s^.next:=p; ENDP; PROC unknown1(VAR t:pointer); VAR p,temp: pointer; finish: boolean; BEGIN inistack(s); finish:=false; p:=t; REPEAT WHILE p<> NIL DO [temp:=p^.llink; p^.llink:=p^.rlink; p^.rlink:=temp; (7)_______; p:=p^.llink; ]; IF (8)____THEN [p:=gettop(s);temp;=pop(s);] ELSE (9)_______ UNTIL (10)___ ENDP; (25 分) 65.具有n 个结点的完全二叉树,已经顺序存储在一维数组A[1..n]中,下面算法是将A 中 顺序存储变为二叉链表存储的完全二叉树。请填入适当的语句在下面的_______上,完成上 述算法。 TYPE ar=ARRAY[1..n] OF datatype; pointer=RECORD data:datatype; lchild, rchild: pointer; END; PROCEDURE btree(VAR a: ar; VAR p:pointer); VAR i:integer; PROCEDURE createtree(VAR t: pointer;i: integer) BEGIN (1)_______; t^.data=a[i]; IF(2)_____THEN creattree((3)_______) ELSE t^.lchild:=NIL; IF(4)_____THEN createtree((5)_______) ELSE t^.rchild:=NIL; END; BEGIN j:= (6)__; createtree(p,j) END; (15 分) 66.设一棵二叉树的结点定义为 struct BinTreeNode{ ElemType data; BinTreeNode *leftchild,*rightchild; } 现采用输入广义表表示建立二叉树。具体规定如下: (1)树的根结点作为由子树构成的表的表名放在表的最前面; (2)每个结点的左子树和右子树用逗号隔开。若仅有右子树没有左子树,逗号不能省略。 (3)在整个广义表输入的结尾加上一个特殊的符号(例如“#”)表示输入结束。 例如,对于如右图所示的二叉树,其广义表表示为A(B(D,E(G)),C(,F))。 此算法的基本思路是:依次从保存广义表的字符串ls 中输入每个字符。若遇到的是字母(假 设以字母作为结点的值),则表示是结点的值,应为它建立一个新的结点,并把该结点作为 左子女(当k=1)或右子女(当k=2)链接到其双亲结点上。若遇到的是左括号“(”,则表 明子表的开始,将k 置为1;若遇到的是右括号“)”,则表明子表结束。若遇到的是逗号 “,”,则表示以左子女为根的子树处理完毕,接着处理以右子女为根的子树,将K 置为2。 在算法中使用了一个栈s,在进入子表之前,将根结点指针进栈,以便括号内的子女链接之 用。在子表处理结束时退栈。相关的栈操作如下: MakeEmpty(s) 置空栈 Push(s,p) 元素p 入栈 Pop(s) 退栈 Top(s) 存取栈顶元素的函数 下面给出了建立二叉树的算法,其中有5 个语句缺失,请阅读此算法并把缺失的语句补上。 (每空3 分) void CreatBinTree(BinTreeNode *&BT,char ls){ Stacks; MakeEmpty(s); BT=NULL; //置空二叉树 BinTreeNode *p; int k; istream ins(ls); //把串ls 定义为输入字符串流对象ins ; char ch; ins>>ch; //从ins 顺序读入一个字符 while (ch != ‘#’){ //逐个字符处理,直到遇到‘#’为止 switch(ch){ case ‘(’: (1)___;k=1; break; case ‘)’: pop(s); break; case’,’ : (2)___; break; default :p=new BinTreeNode; (3)____;p->leftChild=NULL;p->rightChild=NULL; if(BT==NULL) (4)___;else if (k==1) top(s)->leftChild=p; else top(s)->rightChild=p; } (5)____; } } (15 分) 67. 判断带头结点的双向循环链表L 是否对称相等的算法如下所示,请在划线处填上正确的 语句 FUNCTION equal(l:pointer) :boolean; VAR p,q:pointer; result: Boolean; BEGIN result =true ; p:= l^.link; q:=l^.pre ; WHILE (p<>q) AND ((1)_______)DO IF p^.data=q^.data THEN BEGIN (2)___; (3)____; END; ELSE result=false ; return(result); END; ( 9 分) 68.下列是先序遍历二叉树的非递归子程序,请阅读子程序,填充空格,使其成为完整的算 法。 C 语言函数: void example(b) btree *b; { btree *stack[20], *p; int top; if (b!=null) { top=1; stack[top]=b; while (top>0) { p=stack[top]; top--; printf(“%d”,p->data); if (p->rchild!=null) {(1)___; (2)___; } if (p->lchild!=null) (3)___; (4)__; }}}} (10 分) 69.下述是一个由二叉树的前序序列和中序序列构造该二叉树的算法,其中,数组A[1..n] 存放前序序列,数组B[1..n]存放中序序列,s 为根结点指针,i,j 为树s 的前序序列在 A[1..n]中的开始位置和结束位置,x,y 为树s 的中序序列在B[1..n]中的开始位置和结束位 置。所生成的二叉树采用二叉链表存储结构,其结点的形式为(lchild,data,rchild)。请 在算法的空框中填入适当语句,使其成为一个完整的算法。 PROCEDURE creatBT(i,j,x,y: integer; VAR s: link); VAR k,L: integer; BEGIN s:= NIL; IF(1)__THEN BEGIN new (s); s^.data:=a[i]; k:=x; WHILE(2)_______DO k:=k+1; L:= (3)____; IF k=x THEN s^.lchild:=NIL; ELSE(4)_______; IF k=y THEN s^.rchild:=NIL; ELSE(5)_______; END END; (9 分) 70.已知中序遍历bt 所指二叉树算法如下,s 为存储二叉树结点指针的工作栈,请在划线处 填入一条所缺语句。 PROC inorder (bt:bitreptr); inistack(s); (1)_______; WHILE NOT empty(s) DO [WHILE gettop(s)<>NIL DO push(s,gettop(s)↑.lchild); (2)_______; IF NOT empty(s) THEN [visit (gettop(s)^); p:=pop(s); (3)_______ ] ] ENDP;{inorder} (9 分) 71.以下程序是二叉链表树中序遍历的非递归算法,请填空使之完善。二叉树链表的结点类 型的定义如下: typedef struct node /*C 语言/ {char data; struct node *lchild,*rchild;}*bitree; void vst(bitree bt) { bitree p; p=bt; initstack(s); while(p || !empty(s)) if(p) { push (s,p); (1)___; } else { p=pop(s); printf(“%c”,p->data); (2)____; } } (10分) 72.二叉树存储结构同上题,以下程序为求二叉树深度的递归算法,请填空完善之。 int depth(bitree bt) {int hl,hr; if (bt==NULL) return((1)___); hl=depth(bt->lchild); hr=depth(bt->rchild); if((2)___) (3)_____; return(hr+1); } 73.n 个结点的完全二叉树存储在数组a 中,下面为非递归的先序遍历算法。 PROC preorder(a); BEGIN top:=0; t:=1; WHILE (t<=n) OR (1)__ _DO BEGIN WHILE t<=n DO BEGIN write(a[t]); top:=top+1; s[top]:=t; t:= (2)_;END; IF top>0 THEN BEGIN t:=s[top]*2+1; top:= (3)__; END; END; END; (6 分) 74.后序遍历二叉树的非递归算法,bt 是二叉树的根,S 是一个栈,maxsize 是栈的最大 容量。 TYPE bitreptr=^bnodetp; bnodetp=RECORD data:datatype; lchild,rchild:bitreptr END; TYPE stacktyp=RECORD data:ARRAY[1..maxsize] OF bitreptr;top:0..maxsize;END; PROCEDURE posterorder(bt:bitreptr); BEGIN S.top:=0;p:=bt; REPEAT WHILE p<>NIL DO BEGIN S.top:=S.top+1; IF S.top>maxsize THEN stackfull ELSE BEGIN S.data[S.top]:=p; (1)__; END END; IF S.data[S.top]^.rchild<>NIL THEN (2)__ ELSE BEGIN REPEAT write (S.data[S.top]^.data); S.top=S.top-1; UNTIL S.top=0 OR S.data[S.top]^.rchild<>S.data[S.top+1]; IF S.data[S.top]^.rchild<>S.data[S.top+1] THEN (3)__; END; UNTIL(4)___; END; (7 分) 75.由二叉树的前序遍历和中序遍历序列能确定唯一的一棵二叉树,下面程序的作用是实现 由已知某二叉树的前序遍历和中序遍历序列,生成一棵用二叉链表表示的二叉树并打印出后 序遍历序列,请写出程序所缺的语句。 #define MAX 100 typedef struct Node {char info; struct Node *llink, *rlink; }TNODE; char pred[MAX],inod[MAX]; main(int argc,int **argv) { TNODE *root; if(argc<3) exit 0; strcpy(pred,argv[1]); strcpy(inod,argv[2]); root=restore(pred,inod,strlen(pred)); postorder(root); } TNODE *restore(char *ppos,char *ipos,int n) { TNODE *ptr; char *rpos; int k; if(n<=0) return NULL; ptr->info=(1)_______; for((2)_______ ; rposllink=restore(ppos+1, (4)_______,k ); ptr->rlink=restore ((5)_______+k,rpos+1,n-1-k); return ptr; } postorder(TNODE*ptr) { if(ptr=NULL) return; postorder(ptr->llink); postorder(ptr->rlink); printf(“%c”,ptr->info); } (10 分) 76.已给如下关于二叉树的类型说明: TYPE tree=^node ; node=RECORD data :integer; left ,right:tree END; 以下过程实现对二叉树t 前序遍历的非递归算法: PROCEDURE preorder(t:tree ); VAR stack: ARRAY [1..100] OF tree; nd: tree; top: integer; BEGIN top:=1; stack[top]:=t; WHILE(1)___ DO BEGIN nd:=stack[top];top:=top -1; write (nd^.data); IF (nd^.right<>NIL) THEN BEGIN top:=top +1; (2)___ END; IF (3)___THEN BEGIN (4) ;stack[top]:= nd^.left;END END END;(8 分) 77.下面是中序线索树的遍历算法,树有头结点且由指针thr 指向。树的结点有五个域,分 别为数据域 data,左、右孩子域 lchild、rchild 和左、右标志域 ltag,rtag。规定,标志 域为1 是线索,O 是指向孩子的指针。 inordethread(thr) {p=thr->lchild; while ((1)______) { while((2) _____) p= (3) ___; printf(p->data); while((4)_________) { p=(5)___;printf(p->data);} p= (6)_;} }(6 分) 78.下面的算法在中序线索树中找由指针所指结点的后继并由指针指向该后继结点,试补充 完整(线索树的结点有五个域data,lchild,rchild,左、右标志域ltag、rtag,并规定标志0 指向孩子,1 指向线索。 PROC inorder_next(p); (1)__ ; IF p^.rtag=0 THEN WHILE(2)____DO q:= (3)___; return(q) ENDP;(6 分) 79.线索二叉树有数据域data,左右孩子域lchild 和rchild,左右标志ltag 及rtag,规定 标志为1 对应的孩子域是线索,0 则为指向孩子的指针。规定在储存线索二叉树时,完成下 面中序线索化过程。(存储线索二叉树,不增加头结点,只在原有的由tree 指向的二叉树 中增加线索,此处也不考虑c 语言的具体语法与约定,线索化前所有的标志tag 都是0)。 thread_inorder (tree) { if(tree!=null) { thread_inorder((1)____); if(tree->lchild==(2)______) { tree->ltag=1; tree->lchild=pre; } if((3)___ == null){ (4)_______; (5)_______;} pre=p; thread-inorder((6)_______); } }(6 分) 80.如下的算法分别是后序线索二叉树求给定结点node 的前驱结点与后继结点的算法,请 在算法空格处填上正确的语句。设线索二叉树的结点数据结构为 (lflag,left,data,right,rflag),其中: lflag= 0, left 指向其左孩子,lflag= 1,left 指向其前驱;rflag=0,right 指向其右孩子, rflag=1,right 指向其后继。 prior(node,x) { if (node !=null) if ((1)_____ ) *x=node->right; else *x=node->left; } next(bt, node, x) {(2)_____; if (node!=bt && node!=null) if (node->rflag) (3)_______ ; else {do t=*x; (4)_______;while (*x==node); *x=t; } } (8 分) 四、应用题 1.从概念上讲,树,森林和二叉树是三种不同的数据结构,将树,森林转化为二叉树的基 本目的是什么,并指出树和二叉树的主要区别。(5 分) 2.树和二叉树之间有什么样的区别与联系?(5 分) 3.请分析线性表、树、广义表的主要结构特点,以及相互的差异与关联。 (10 分) 4. 设有一棵算术表达式树,用什么方法可以对该树所表示的表达式求值?(4 分) 5.将算术表达式((a+b)+c*(d+e)+f)*(g+h)转化为二叉树。(4 分) 6. 一棵有n(n>0)个结点的d 度树, 若用多重链表表示, 树中每个结点都有d 个链域, 则在表 示该树的多重链表中有多少个空链域? 为什么? (6 分) 7. 一棵二叉树中的结点的度或为0 或为2,则二叉树的枝数为2(n0-1),其中n0 是度为0 的 结点的个数。 (3 分) 类似本题的另外叙述有: (1)若二叉树中度为1 的结点数为0,则该二叉树的总分支数为2(n0-1),其中n0 为叶结 点数。(5 分) 8.一个深度为L 的满K 叉树有以下性质:第L 层上的结点都是叶子结点,其余各层上每个结 点都有K棵非空子树,如果按层次顺序从1 开始对全部结点进行编号,求: 1)各层的结点的数目是多少? 2)编号为n 的结点的双亲结点(若存在)的编号是多少? 3)编号为n 的结点的第i 个孩子结点(若存在)的编号是多少? 4)编号为n 的结点有右兄弟的条件是什么?如果有,其右兄弟的编号是多少? 请给出计算和推导过程。(10 分) 类似本题的另外叙述有: (1)一棵高度为h 的满k 叉树有如下性质:根据结点所在层次为0;第h 层上的结点都是叶 子结点;其余各层上每个结点都有k 棵非空子树,如果按层次自顶向下,同一层自左向右, 顺序从1 开始对全部结点进行编号,试问: 1)各层的结点个数是多少?(3 分) 2)编号为i 的结点的双亲结点(若存在)的编号是多少?(3 分) 3)编号为i 的结点的第m 个孩子结点(若存在)的编号是多少?(3 分) 4)编号为i 的结点有右兄弟的条件是什么?其右兄弟结点的编号是多少?(3 分) 9.证明任一结点个数为n 的二叉树的高度至少为O(logn). (5 分) 10.有n 个结点并且其高度为n 的二叉树的数目是多少? (5 分) 11.已知完全二叉树的第七层有10 个叶子结点,则整个二叉树的结点数最多是多少?(5 分) 12.高度为10 的二叉树,其结点最多可能为多少?(4 分) 13.任意一个有n 个结点的二叉树,已知它有m 个叶子结点,试证明非叶子结点有(m-1)个 度为2,其余度为1。(5 分) 14. 已知A[1..N]是一棵顺序存储的完全二叉树,如何求出A[i]和A[j]的最近的共同祖先? (4 分) 15.给定K(K>=1),对一棵含有N 个结点的K 叉树(N>0)、请讨论其可能的最大高度和最小 高度。 (8分) 16.已知一棵满二叉树的结点个数为20 到40 之间的素数,此二叉树的叶子结点有多少个? (3 分) 17.一棵共有n 个结点的树,其中所有分支结点的度均为K,求该树中叶子结点的个数。(4 分) 18. 如在内存中存放一个完全二叉树,在树上只进行下面两个操作: (1)寻找某个结点双亲 (2)寻找某个结点的儿子; 请问应该用何种结构来存储该二叉树? (3 分) 19.求含有n 个结点、采用顺序存储结构的完全二叉树中的序号最小的叶子结点的下标。要 求写出简要步骤。( 5 分) 20.设二叉树T 中有n 个顶点,其编号为1,2,3,…,n,若编号满足如下性质: (1)T 中任一顶点v 的编号等于左子树中最小编号减1; (2)对T 中任一顶点v,其右子树中最小编号等于其左子树中的最大编号加1。试说明对二叉 树中顶点编号的规则(按何种顺序编号)。(3 分) 21.若一棵树中有度数为1 至m 的各种结点数为n1,n2,…,nm(nm 表示度数为m 的结点个数)请 推导出该树中共有多少个叶子结点n0 的公式。(10 分) 22.若一棵完全二叉树中叶子结点的个数为n,且最底层结点数≧2,则此二叉树的深度H=? (2 分) 23.已知完全二叉树有30 个结点,则整个二叉树有多少个度为0 的结点? (2 分) 24.在一棵表示有序集S 的二叉搜索树(binary search tree)中,任意一条从根到叶结点的路 径将S分为3 部分:在该路径左边结点中的元素组成的集合Sl;在该路径上的结点中的元素 组成的集合S2;在该路径右边结点中的元素组成的集合S3。S=S1∪S2∪S3。若对于任意的 a∈Sl,b∈S2,c∈S3 是否总有a≤b≤c?为什么? (10 分) 25.试证明,在具有n(n>=1)个结点的m 次树中,有n(m-1)+1 个指针是空的。(8 分) 26.对于任何一棵非空的二叉树,假设叶子结点的个数为n0,而次数为2 的结点个数为n2,请给 出n0 和n2 之间所满足的关系式n0=f(n2).要求给出推导过程。(8 分) 27.对于任意一棵非空的二叉树T,我们用n0 表示T 中叶子结点的个数,用n2 表示T 中有两 棵非空子树的结点的个数。(1)给出n0 和n2 所满足的关系式。(2)证明你在(1)中给出 的关系式成立。(10 分) 28.试求有n 个叶结点的非满的完全二叉树的高度; (5 分) 29.对于具有n 个叶子结点,且所有非叶子结点都有左右孩子的二叉树, (1)试问这种二叉树的结点总数是多少?(5 分) (2)试证明Σ=−− nili12 ( 1) =1。其中:li 表示第i 个叶子结点所在的层号(设根结点所在层 号为1)。(10 分) 30.假设高度为H 的二叉树上只有度为0 和度为2 的结点,问此类二叉树中的结点数可能达 到的最大值和最小值各为多少?(4 分) 31.一棵满k 叉树,按层次遍历存储在一维数组中,试计算结点下标的u 的结点的第i 个孩 子的下标以及结点下标为v 的结点的父母结点的下标。 (5 分) 32.二叉树有n 个顶点,编号为1,2,3,… ,n,设: * T 中任一顶点V 的编号等于左子树中最小编号减1; * T 中任一顶点V 的右子树中的最小编号等于其左子树中的最大编号加1; 试描绘该二叉树。(7 分) 33.设T 是具有n 个内结点的扩充二叉树,I 是它的内路径长度,E 是它的外路径长度。 (1)试利用归纳法证明E=I+2n, n>=0.(5 分) (2)利用(1)的结果试说明:成功查找的平均比较次数s 与不成功查找的平均比较次数u 之间的关系可用公式表示s=(1+1/n)u-1,n>=1。 (10 分) 34.一棵非空的有向树中恰有一个顶点入度为0, 其它顶点入度为1,但一个恰有一个顶点入 度为0,其它顶点入度为1 的有向图却不一定是一棵有向树,请举例说明。 (5 分) 35.试给出下列有关并查集(mfsets)的操作序列的运算结果: union(1,2),union(3,4),union(3,5),union(1,7),union(3,6),union(8,9), union(1,8),union(3,10),union(3,11),union(3,12),union(3,13), union(14,15),union(16,0),union(14,16),union(1,3),union(1,14). (union 是合并运算,在以前的书中命名为merge) 要求 (1)对于union(i,j),以i 作为j 的双亲; (5 分) (2)按i 和j 为根的树的高度实现union(i,j),高度大者为高度小者的双亲; (5 分) (3)按i 和j 为根的树的结点个数实现union(i,j),结点个数大者为结点个数小者的双亲。 (5 分) 36.证明:在任何一棵非空二叉树中有下面的等式成立:叶结点的个数=二度结点的个数+1 37. 对于一个堆栈,若其入栈序列为1,2,3,…,n,不同的出入栈操作将产生不同的出栈 序列。其出栈序列的个数正好等于结点个数为n 的二叉树的个数,且与不同形态的二叉树一 一对应。请简要叙述一种从堆栈输入(固定为1,2,3……n)/输出序列对应一种二叉树形 态的方法,并以入栈序列1,2,3(即n=3)为例加以说明。 (7 分) 38. 如果给出了一个二叉树结点的前序序列和对称序序列,能否构造出此二叉树?若能,请 证明之。若不能,请给出反例。如果给出了一个二叉树结点的前序序列和后序序列,能否构 造出此二叉树?若能,请证明之。若不能,请给出反例。(5 分) 类似本题的另外叙述有: (1) 二叉树的中序与后序序列能唯一地定义一棵二叉树吗? 这里所指序列中的符号代表树 结点中的标识符吗?二叉树的前序与后序序列能唯一地定义一棵二叉树吗?为什么?(8 分) 39.试证明:同一棵二叉树的所有叶子结点,在前序序列。对称序序列以及后序序列中都按 相同的相对位置出现(即先后顺序相同),例如前序abc,后序bca 对称序bac。 (10 分) 40. 由二叉树的中序序列及前序序列能唯一的建立二叉树,试问中序序列及后序序列是否也 能唯一的建立二叉树,不能则说明理由,若能对中序序列DBEAFGC 和后序序列DEBGFCA 构造 二叉树。、 (3 分) 41. 证明,由一棵二叉树的前序序列和中序序列可唯一确定这棵二叉树。设一棵二叉树的前 序序列为ABDGECFH,中序序列为:DGBEAFHC 。试画出该二叉树。 (8 分) 类似本题的另外叙述有: (1) 证明:由一棵二叉树的前序序列和中序序列可唯一确定这棵二叉树。 (10 分) (2)证明:由二叉树的中序遍历序列和后序遍历序列可唯一地确定出该二叉树。(4 分) (3)二叉树已知其中序扫描序列和后序扫描序列如何确定这一棵二叉树,并举例说明.(4 分) 42.试证明:仅仅已知一棵二叉树的后序遍历序列和先序遍历序列,不能唯一地确定这棵二 叉树。(8分) 类似本题的另外叙述有: (1) 由二叉树的前序遍历和后序遍历结果能否唯一确定一棵二叉树?解释你的论断。(5 分) (2) 假定某二叉树的前序遍历序列为ABCDEFGHIJ,后序遍历序列为CEFDBJIHGA,据此两个序列 能否唯一确定此二叉树? 若不能,试画出两样具有同样上述遍历序列的二叉树.(3 分) 43. ① 试找出满足下列条件的二叉树 1)先序序列与后序序列相同 2)中序序列与后序序列相同 3)先序序列与中序序列相同 4)中序序列与层次遍历序列相同 ② 已知一棵二叉树的中序序列和后序序列分别为DBEAFIHCG 和DEBHIFGCA, 画出这棵二叉树。 (4 分) 类似本题的另外叙述有: (1)试画出在先根次序和中根次序下结点排列顺序皆相同的所有类型的二叉树形。 试画出在先根次序和后根次序下结点排列顺序皆相同的所有类型的二叉树形。(每题7 分) (2)找出所有的二叉树,其结点在下列两种遍历下恰好都有同样的遍历序列。 1)先序遍历和中序遍历 2)先序遍历和后序遍历 (6 分) (3)找出所有的二叉树,其结点在下列两种遍历下,恰好都是以同样的顺序出现: 1)前序遍历和中序遍历。 2)前序遍历和后序遍历。 (5 分) (4)试找出分别满足下列条件的所有二叉树。 1)先序序列和中序序列相同 2)中序序列和后序序列相同 3)先序序列和后序序列相同(10 分) (5)找出所有满足下列条件的二叉树: 1)它们在先序遍历和中序遍历时,得到的结点访问序列相同; 2)它们在后序遍历和中序遍历时,得到的结点访问序列相同; 3)它们在先序遍历和后序遍历时,得到的结点访问序列相同;(6 分) 44.将下列由三棵树组成的森林转换为二叉树。(只要求给出转换结果)(10 分) 45. 阅读下列说明和流程图,回答问题(1)和问题(2)。 说明:流程图是用来实现中序遍历,二叉树存放在数组tree 中,每个数组元素存放树中一 个结点,每个结点的形式为(值,左指针,右指针),分别用tree[i].v,tree[i].l, tree[i].r 来表示第i 个结点的值,左指针,右指针,其中左,右指针的值为所指结点在数 组中的下标,若指针的值为0,表示它指向空树,图中指针root 用以指向二叉树的根结点。 问题: (1)填充流程图中的①、②、③,使其按中序遍历二叉树。 (2)把流程图中的(A)框移至哪个位置(图中Ⅰ~Ⅸ)使流程图的算法从中序遍历变成后 序遍历。(13 分) 46.设一棵二叉树的先序、中序遍历序列分别为 先序遍历序列: A B D F C E G H 中序遍历序列: B F D A G E H C (1)画出这棵二叉树。 (2)画出这棵二叉树的后序线索树。 (3)将这棵二叉树转换成对应的树(或森林)。 (10 分) 47.已知一棵二叉树的对称序和后序序列如下: 对称序:GLDHBEIACJFK 后序: LGHDIEBJKFCA (1) (1) (2 分)给出这棵二叉树: (2) (2) (2 分)转换为对应的森林: (3) (3) (4 分)画出该森林的带右链的先根次序表示法: (4) (4 分) 画出该森林带度数的后根次序表示法: (5) (4 分)在带度数的后根次序表示法中,不包含指针,但仍能完全反映树的结构。写出以 结点x 为根的子树在后根次序序列中的前驱的求法。(用语言叙述,不用写算法)(16 分) 48.设某二叉树的前序遍历序列为:ABCDEFGGI,中序遍历序列为:BCAEDGHFI: (1)试画出该二叉树; (2)写出由给定的二叉树的前序遍历序列和中序遍历序列构造出该二叉树的算法。 (3)设具有四个结点的二叉树的前序遍历序列为abcd;S为长度等于四的由a,b, c,d排列构成的字符序列,若任取S作为上述算法的中序遍历序列,试问是否一定能构造 出相应的二叉树,为什么?试列出具有四个结点二叉树的全部形态及相应的中序遍历序列。 (15 分) 类似本题的另外叙述有: (1)已知二叉树的先序序列: CBHEGAF, 中序序列: HBGEACF, 试构造该二叉树(4 分) (2)已知二叉树按中序排列为BFDAEGC,按前序排列为ABDFCEG,要求画出该二叉树。(2 分) (3)已知一棵二叉树的前序序列 A,B,D,C,E,F,中序序列B,D,A,E,F,C. 画出这棵二叉树。 (5 分) (4)已知一棵二叉树的前序遍历结果是:ABCDEFGHIJ,中序遍历的结果是:BCEDAGHJIF,试 画出这棵二叉树。(7 分) (5)已知二叉树BT 各结点的先序、中序遍历序列分别为ABCDEGF 和CBAEDF,试画出该二叉 树。(6 分) 49. 假设一棵二叉树的前序序列为ABCD,它的中序序列可能是DABC 吗? (5分) 类似本题的另外叙述有: (1)一棵前序序列为1,2,3,4,的二叉树,其中序序列可能是4,1,2,3 吗?设一棵二 叉树的前序序列为1,2,3,4,5,6,7,8,9,其中序序列为2,3,1,5,4,7,8,6, 9,试画出该二叉树。(7 分) 50.一棵非空的二叉树其先序序列和后序序列正好相反,画出这棵二叉树的形状。(5 分) 51.已知一棵二叉树的后序遍历序列为EICBGAHDF,同时知道该二叉树的中序遍历序列为 CEIFGBADH,试画出该二叉树。类似本题的另外叙述有: (1)已知二叉树BT各结点的中序和后序序列分别为DFBACEG和FDBGECA, 试构造出该二叉树BT,并作简要说明。 (8 分) (2)已知二叉树的中序遍历序列为G F B E A N H M,后序遍历的结点序列为G E B F H N M A ,画出此二叉树的形态。(5 分) (3)已知二叉树的后序序列为ABCDEFG 和中序序列为ACBGEDF,构造出该二叉树。(6 分) (4)已知某二叉树的后序遍历和中序遍历如下,构造出该二叉树。 后序遍历序列: G D B E I H F C A 中序遍历序列:D G B A E C H I F (3 分) (5)已知一个二分树的中序序列和后序序列如下: 中序:A B C D E F G H I J 后序:A C D B H J I G F E 试画出此二分树的结构。(10 分) 52.假设一棵二叉树的层次序列为ABCDEFGHIJ,中序序列DBGEHJACIF。请画出这棵二叉树。 (6 分) 类似本题的另外叙述有: (1)假设一棵二叉树的层次次序(按层次递增顺序排列,同一层次自左向右)为 ABECFGDHI,中序序列为BCDAFEHIG。请画出该二叉树,并将其转换为对应的森林。(6 分) 53. 已知一个森林的先序序列和后序序列如下,请构造出该森林。 先序序列:ABCDEFGHIJKLMNO 后序序列:CDEBFHIJGAMLONK (5 分) 54. 画出同时满足下列两条件的两棵不同的二叉树。 (1)按先根序遍历二叉树顺序为ABCDE。 (2)高度为5 其对应的树(森林)的高度最大为4。(5 分) 55.用一维数组存放的一棵完全二叉树;ABCDEFGHIJKL。请写出后序遍历该二叉树的访问结 点序列。(5 分) 56.一棵二叉树的先序、中序、后序序列如下,其中一部分未标出,请构造出该二叉树。 先序序列 :_ _ C D E _ G H I _ K 中序序列 :C B _ _ F A _ J K I G 后序序列 :_ E F D B _ J I H _ A (6 分) 类似本题的另外叙述有: (1)一棵二叉树的先序、中序和后序序列分别如下,其中有一部分为显示出来。试求出空 格处的内容,并画出该二叉树。 先序序列: _ B F I C E H G 中序序列:D K F I A E J C 后序序列: K F B H J G A (5 分) (2)已知一棵二叉树的先序 中序和后序序列如下,其中空缺了部分,请画出该二叉树。 先序:_ B C _ E F G _ I J K _ 中序:C B E D _ G A J _ H _ L 后序:_ E _ F D _ J _ L _ H A (5 分) (3)已知含有8 个结点的一棵二叉树,按先序、中序、后序进行遍历后,有些结点序号不 清楚如下图示。要求构造出一棵符合条件的二叉树。 先根序遍历 _ 2 3 _ 5 _ 7 8 中根序遍历 3 _ 4 1 _ 7 8 6 后根序遍历 _ 4 2 _ _ 6 5 1(5 分) 57.M 叉树的前序和后序遍历分别与由它转换成的二叉树的哪种遍历相对应? (4 分) 58.证明:在二叉树的三种遍历序列中,所有叶子结点间的先后关系都是相同的。要求每步 论断都指出根据。(5 分) 59. 下表中M﹑N 分别是一棵二叉树中的两个结点,表中行号i=1,2,3,4 分别表示四种M﹑N 的相对关系,列号j=1,2,3 分别表示在前序、中序、后序遍历中M,N 之间的先后次序关系。 要求在i,j 所表示的关系能够发生的方格内打上对号。例如:如果你认为n 是m 的祖先,并 且在中序遍历中n 能比m 先被访问,则在(3,2)格内打上对号 (10 分) 60.用一维数组存放的一棵完全二叉树如下图所示: 写出后序遍历该二叉树时访问结点的顺序。(6 分) 61.设树形T 在后根次序下的结点排列和各结点相应的次数如下: 后根次序:BDEFCGJKILHA 次 数:000030002024 请画出T的树形结构图。 (4 分) 62.已知二叉树采用二叉链表方式存放,要求返回二叉树T 的后序序列中的第一个结点的 指针,是否可不用递归且不用栈来完成?请简述原因。 63.对于二叉树T 的两个结点n1 和n2,我们应该选择树T 结点的前序、中序和后序中哪两个 序列来判断结点n1 必定是结点n2 的祖先,并给出判断的方法。不需证明判断方法的正确性。 (10 分) 64.设二叉树的存储结构如下(每题5 分,共15 分) 其中,T 为树根结点的指针,LLINK、RLINK 分别指向结点的左右子女,INFO 为其数据域,请完 成下列各题: (1)画出二叉树T 的逻辑结构. (2)写出按前序、中序和后序周游二叉树T 得到的结点序 列. (3)画出二叉树T 的后序线索树。(15 分) 65.在二叉树的前序遍历和中序遍历的递归算法中,最后一个递归调用语句在调用时所保留 的参数有什么作用?如何清除最后这个递归语句? (8 分) 66.在二叉树的Llink-Rlink 存储表示中,引入“线索”的好处是什么?(2分) 67.按下面要求解下图中二叉树的有关问题: (1)对此二叉树进行后序后继线索化 ;(2)将此二叉树变换为森林; (3)用后根序遍历该森林,;写出遍历后的结点序列。(10 分) 类似本题的另外叙述有: (1)已知一棵二叉树的先序遍历序列为:AEFBGCDHIKJ,中序遍历序列为:EFAGBCHKIJD。 试写出此二叉树的后序遍历序列,并用图画出它的后序线索二叉树。(10 分) 68.对下图所示二叉树分别按前序﹑中序﹑后序遍历, 给出相应的结点序列,同时给二叉树加上中序线索。(5 分) 69. 假设一个二叉树的两种遍历如下: 前序:ABFGCHDEIJLK 中序:FGBHCDILJKEA (1)画出这棵二叉树以及它的中序线索树; (2)写出在中序线索树的情况下,找到结点N 的前驱结点的算法INORDER-PRIOR(N,X) 【上海海运学院 1996 四、 (10 分)】 70.已知一棵二叉树的中序(或中根)遍历结点排列为DGBAECHIF,后序(或后根)遍历结 点排列为GDBEIHFCA, (1)试画出该二叉树; (2)试画出该二叉树的中序穿线(或线索)树; (3)试画出该二叉树(自然)对应的森林;(5 分) 71.设二叉树BT 的存储结构如下: 其中BT 为树根结点的指针,其值为6,Lchild,Rchild 分别为结点的左、右孩子指针域,data 为结点的数据域。试完成下列各题: (l)画出二叉树BT 的逻辑结构; (2)写出按前序、中序、后序遍历该二叉树所得到的结点序列; (3)画出二叉树的后序线索树。(15 分) 72.请说明是否存在这样的二叉树,即它可以实现后序线索树进行后序遍历时不使用栈;而 对前序线索树进行前序遍历时,又有什么样的二叉树可不使用栈。 (5 分) 73.一棵左右子树均不空的二叉树在先序线索化后,其空指针域数为多少?(5 分) 74 . 在前序线索树上, 要找出结点p 的直接后继结点, 请写出相关浯句。结点结构为 (ltag,lc,data,rtag,rc)。(5 分) 7 5.对于后序线索二叉树,怎样查找任意结点的直接后继;对于中序线索二叉树,怎样查找 任意结点的直接前驱?(4 分) 76.将下列树的孩子—兄弟链表改为后根遍历全线索链表。(10 分) 77. 已知一棵二叉树的前序遍历为ABECDFGHIJ,中序遍历为EBCDAFHIGJ。试画出这棵树和它 的中序线索树。假定用于通讯的电文仅有8 个字母C1,C2,…,C8 组成,各个字母在电文中 出现的频率分别为5,25,3,6,10,11,36,4,试为这8 个字母设计哈夫曼编码树。(10 分) 78.设有正文AADBAACACCDACACAAD,字符集为A,B,C,D,设计一套二进制编码,使得上述正文 的编码最短。(4 分) 类似本题的另外叙述有: (1)设有正文MNOPPPOPMMPOPOPPOPNP,字符集为M,N,O,P,设计一套二进制编码,使得 上述正文的编码最短。(4 分) 79.给定集合{15,3,14,2,6,9,16,17} (1)(3 分)用□表示外部结点,用○表示内部结点,构造相应的huffman 树: (2) (2 分)计算它的带权路径长度: (3)(3 分)写出它的huffman 编码: (4)(3 分)huffman 编码常用来译码,请用语言叙述写出其译码的过程。(11 分) 类似本题的另外叙述有: (1) 如果通信字符a,b,c,d 出现频度分别为:7,5,2,4 请画出哈夫曼树并给出相应的 哈夫曼编码。(5 分) (2)给定一组数列(15,8,10,21,6,19,3)分别代表字符A,B,C,D,E,F,G 出现的频度,试叙 述建立哈夫曼树的算法思想,画出哈夫曼树,给出各字符的编码值,并说明这种编码的优点。 (10 分) (3)设通信中出现5 中字符A、B、C、D、E 对应的频率为0.2,0.1,0.5,0.15,0.25 构造哈 夫曼树,并给出对应字符的编码。(10 分) (4) 设A、B、C、D、E、F 六个字母出现的概率分别为7,19,2,6,32,3。试写出为这六个字 母设计的HUFFMAN 编码, 并画出对应的HUFFMAN 树. (10 分) (5)设用于通信的电文由8 个字母组成, 字母在电文中出现的频率分别 为:7,19,2,6,32,3,21,10。 试为这8 个字母设计哈夫曼编码.使用0-7 的二进制表示形式是另一种编码方案,试比较这两 种方案的优缺点。(10 分) (6)假设用于通讯的电文由8 个字符组成,其出现的频率为5,29,7,8,14,23,3,11。试为这 8 个字符设计哈夫曼编码。 (5 分) (7)假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字母构成。它们在电文中出现的频 度分别为{0.31,0.16,0.10,0.08,0.11,,0.20,0.04}, 1) 为这7 个字母设计哈夫曼编码; 2)对这7 个字母进行等长编码,至少需要几位二进制数?哈夫曼编码比等长编码使电文总 长压缩多少? (5 分) (8)试构造一棵二叉树,包含权为1,4,9,16,25,36,49,64,81,100 等10 个终端结点,且具有 最小的加权路径长度WPL。(12 分) (9)带权结点为{5,6,7,8,9},构造Huffman 树,计算带权路径长度。 (10)以数据集{2,5,7,9,13}为权值构造一棵哈夫曼树,并计算其带权路径长度。(5 分) (11)假设用于通讯的电文仅由8 个字母组成,字母在电文中出现的频率分别为 7,19,2,6,32,3,21,10。试为这8 个字母设计哈夫曼编码。使用0∽7 的二进制表示形式是另 一 种编码方案。对于上述实例,比较两种方案的优缺点。(8 分)。 (12)设用于通讯的电文仅由8 个字母组成,他们在电文中出现的频率分别为0.30,0.07, 0.10,0.03,0.20,0.06,0.22,0.02,试设计哈夫曼树及其编码。使用0---7 的二进制表 示形式是另一种编码方案。给出两种编码的对照表、带权路径长度WPL 值并比较两种方案 的优缺点。 (13) 给定一组权值2,3,5,7,11,13,17,19,23,29,31,37,41,试画出用Huffman 算法建造 的Huffman树。(4 分) (14) 以数据集{3,4,5,8,12,18,20,30}为叶结点,构造一棵哈夫曼树,并求其带权路径长度。 (2 分) 80. 给定权W1,W2,…,Wm 。说明怎样来构造一个具有最小的加权路径长度的k 叉树。试对 于权1,4,9,16,25,36,49,64,81,100 来构造最优的三叉树,并给出其最小加权路径长度。(12 分) 81.已知下列字符A、B、C、D、E、F、G 的权值分别为3、12、7、4、2、8,11,试填写出 其对应哈夫曼树HT 的存储结构的初态和终态。(10 分) 82.什么是前缀编码?举例说明如何利用二叉树来设计二进制的前缀编码。 (3 分) 83.如果一棵huffman 树T 有n0 个叶子结点,那么,树T 有多少个结点,要求给出求解过程。 (10 分) 84.设T 是一棵二叉树,除叶子结点外,其它结点的度数皆为2,若 T 中有6 个叶结点,试 问: (1)T 树的最大深度Kmax=?最小可能深度Kmin=? (2)T 树中共有多少非叶结点? (3) 若叶结点的权值分别为1,2,3,4,5,6。请构造一棵哈曼夫树,并计算该哈曼夫树的带权 路径长度wpl。 85.对如下算法,解答下列问题。 PROCEDURE inorder(T:bitree); BEGIN top:=1; s[top]:=T; REPEAT WHILE s[top]<>NIL DO BEGIN s[top+1]:=s[top]^.lchild; top:=top+1; END; IF top>1 THEN BEGIN top:=top-1;WRITE (s[top]^.data);s[top]:=s[top]^.rchild;END; UNTIL top=0 END; (1)该算法正确吗?循环结束条件top=0 能否满足? (2)若将IF top>1…改为IF top>0…是否正确? (3)若将结束条件改为top=1,其它不变,是否正确? (4)若仅将结束处条件改为(top=1)AND (s[top]=NIL),是否正确? (5)试找出二叉树中各结点在栈中所处层次的规律。 (10 分) 五、算法设计题 1.假设一个仅包含二元运算符的算术表达式以链表形式存储在二叉树BT 中,写出计算该算 术表达式值的算法。(10 分) 2.给出算法将二叉树表示的表达式二叉树按中缀表达式输出,并加上相应的括号。(10 分) 3. 用C 语言完成下列各题: (1)设表达式a+b*(c-d)-e/f 可以表示成如下二叉树结构: 其中t 为根结点指针,试运用后序遍历二叉树的规则,写出对表达式求值的算法:EXPVALUE (10 分) 4.编程求以孩子—兄弟表示法存储的森林的叶子结点数。要求描述结构。【北京工业大学 2000 五(10分) 5.假定用两个一维数组L[N]和R[N]作为有N 个结点1,2,…, N 的二元树的存储结构。L[i] 和R[i]分别指示结点 i 的左儿子和右儿子;L[i]=0(R[i]=0)表示i 的左(右)儿子为空。 试写一个算法,由L和R 建立一个一维数组T[n],使T[i]存放结点i 的父亲;然后再写一个判 别结点U 是否为结点V 的后代的算法。 (14 分) 类似本题的另外叙述有: (1)假定用两个一维数组L[1..n]和R[1..n]作为有n 个结点的二叉树的存储结构,L[i]和R[i] 分别指示结点i 的左孩子和右孩子,0 表示空。写一算法,建立一维数组T[1..n],使T 中 第i(i=1,2,...,n)个分量指示结点i 的双亲,然后判别结点u 是否为v 的子孙的算法。(17 分) 6.要求二叉树按二叉链表形式存储, (1)写一个建立二叉树的算法。(2)写一个判别给定的二叉树是否是完全二叉树的算法。 完全二叉树定义为:深度为K,具有N 个结点的二叉树的每个结点都与深度为K 的满二叉树 中编号从1 至N 的结点一一对应。此题以此定义为准。(12 分) 类似本题的另外叙述有: (1)试写一算法判断某二叉树是否是完全二叉树。 (15 分) (2)编程,判断一棵二叉链表表示的二叉树是否是完全二叉树。 (10 分) (3)编写算法判断一棵二叉树BT 是否是完全二叉树。(20 分) (4)假设二元树用左右链表示,试编写一算法,判别给定二元树是否为完全二元树? (14 分) (5)设二叉树以二叉链表为存储结构,试给出判断一棵二叉树是否为满二叉树的算法,用 类C语言写为函数形式。(16 分) (6)试写一算法判别某二叉树是否是完全二叉树。(20 分) 7.有n 个结点的完全二叉树存放在一维数组A[1..n]中,试据此建立一棵用二叉链表表示的 二叉树 ,根由tree 指向。 (6 分) 8.设任意非空二叉树中结点按层次顺序依次编号为1,2,…,n(n>0),其存储结构采用下图所 示形式,其中i 表示结点的编号, L(i)的值是i 的左儿子的编号,R(i)的值是i 的右儿子的 编号。若L(i),R(i)的值为0,表示结点i 无左儿子或右儿子。试设计算法: (1)求出二叉树的高度。 (2)求出每个结点的层号(根结点层号为1),并填入D(i)中。(可采用任何高级语言,但 要注明你所采用的语言名称)。 (13 分) 9.已知深度为h 的二叉树采用顺序存储结构已存放于数组BT[1:2h-1]中,请写一非递归算法, 产生该二叉树的二叉链表结构。设二叉链表中链结点的构造为(lchild,data,rchild),根结 点所在链结点的指针由T 给出。(15 分) 10. 二叉树的动态二叉链表结构中的每个结点有三个字段:data,lchild,rchild。其中指 针lchild和rchild 的类型为bitre。静态二叉链表是用数组作为存储空间,每个数组元素存 储二叉树的一个结点,也有三个字段:data,lchild,rchild。所不同的是,lchild 和rdhild 为integer 型,分别用于存储左右孩子的下标,如果没有左右孩子,则相应的值为0。例如, 下面左图所示的二叉树的静态二叉链表如右图所示。编写算法由二叉树的动态二叉链表构造 出相应的静态二叉链表a[1..n],并写出其调用形式和有关的类型描述。其中n 为一个确定 的整数。(8 分) 11.假设以双亲表示法作树的存储结构,写出双亲表示的类型说明,并编写求给定的树的深 度的算法。(注:已知树中结点数)(15 分) 12.试编写算法求出二叉树的深度。二叉树的存储结构为如下说明的二叉链表: TYPE btre=↑bnode bnode=RECORD data:datatype; lch,rch:btre END; (15 分) 13.二叉树采用二叉链表存储: (1)编写计算整个二叉树高度的算法(二叉树的高度也叫二叉树的深度)。 (2)编写计算二叉树最大宽度的算法(二叉树的最大宽度是指二叉树所有层中结点个数的 最大值)。 14. 以孩子兄弟链表为存储结构,请设计递归和非递归算法求树的深度。(18分) 类似本题的另外叙述有: (1)设T 是一棵n 元树,Tb 是T 的孩子兄弟表示(二叉链表)的二叉树,试编程,由Tb 计 算T 的高度(要求用非递归方法实现)。 15.设一棵二叉树的结点结构为 (LLINK,INFO,RLINK),ROOT 为指向该二叉树根结点的指针, p 和q 分别为指向该二叉树中任意两个结点的指针,试编写一算法ANCESTOR(ROOT, p,q,r),该算法找到p 和q 的最近共同祖先结点r。(15 分) 16.已知一棵二叉树按顺序方式存储在数组A[1..n]中。设计算法,求出下标分别为i 和j 的两个结点的最近的公共祖先结点的值。 17.设计这样的二叉树,用它可以表示父子、夫妻和兄弟三种关系,并编写一个查找任意父 亲结点的所有儿子的过程。(8 分) 18.在二叉树中查找值为x 的结点,试编写算法(用C 语言)打印值为x 的结点的所有祖先, 假设值为x 的结点不多于一个,最后试分析该算法的时间复杂度(若不加分析,直接写出结 果,按零分算)。 类似本题的另外叙述有: (1)在二叉树中查找值为x 的结点,请编写一算法用以打印值为x 的结点的所有祖先,假设 值为x 的结点不多于1 个。注:采用非递归算法。 (10 分) (2)设二叉树中结点的数据域的值互不相同,试设计一个算法将数据域值为x 的结点的所 有祖先结点的数据域打印出来。 (20 分) (3)设二叉树根指针为t,且树中结点值各不相同,写出算法disp_f(t,x),查找树中值为t 的结点,并显示出其所有祖先结点的值。(20 分) (4)若一棵二叉树中没有数据域值相同的结点,设计算法打印数据域值为x 的所有祖先结 点的数据域。如果根结点的数据域值为x 或不存在数据域值为x 的结点,则什么也不打 印。例如右图所示的二叉树,则打印结点序列为A、C、E。(16 分) 19.利用栈的基本操作写出先序遍历二叉树的非递归算法要求进栈的元素最少,并指出下列 (最右图)二叉树中需进栈 18(4)题图的元素。 (10 分) 20.设一棵完全二叉树使用顺序存储在数组bt[1..n]中,请写 19 题图出进行非递归的前序 遍历算法。 (8 分) 21.若二叉树用以下存储结构表示,试给出求前序遍历的算法: TYPE Tree:=ARRAY[1..max] OF RECORD data:char;parent:integer; END;(15 分) 22.设计算法返回二叉树T 的先序序列的最后一个结点的指针,要求采用非递归形式,且不 许用栈。(8 分) 23.已知一棵高度为K具有n个结点的二叉树,按顺序方式存储: (1)编写用先根遍历树中每个结点的递归算法; (2)编写将树中最大序号叶子结点的祖先结点全部打印输出的算法。 (20 分)。 24.对于二叉树的链接实现,完成非递归的中序遍历过程。 (15 分) 类似本题的另外叙述有: (1)写出中序遍历二叉树的非递归算法及递推算法。(10 分)。 (2)设计一个中序遍历算法,应用栈来存储树结点,要求结点仅能进栈和出栈一次。(本 题指中序遍历二叉树)(10 分) (3)用非递归方式写出二叉树中序遍历算法。(9 分) 25.已知二叉树用下面的顺序存储结构,写出中序遍历该二叉树的算法。 TYPE ARRAY [1..maxn] OF RECORD data:char; //存储结点值 Lc,Rc;integer; END; //存左孩子右孩子的下标,0 表示无左、右孩子。 如树 T=A(B(D,E,(#,G)),C(#,F(H,I)))存储如上图。(10 分) 26.试给出二叉树的自下而上、自右而左的层次遍历算法。(8 分) 27.在一棵以二叉链表表示的二叉树上,试写出用按层次顺序遍历二叉树的方法,统计树中 具有度为1 的结点数目的算法。二叉链表的类型定义为: TYPE bitreptr=^bnodetp; bnodetp=RECORD data:char; lchild,rchild:bitreptr END;(12 分) 类似本题的另外叙述有: (1)请设计算法按层次顺序遍历二叉树。 (20 分) (2)试以二叉链表作存储结构,编写按层次顺序遍历二叉树的算法。 (12 分) (3)已知一棵以二叉链表作存储结构的二叉树,编写按层次顺序(同一层自左至右)遍历 二叉树的算法。(8 分) (4)设二叉树用二叉链表存储,试编写按层输出二叉树结点的算法。(8分) (5)写出按层次顺序打印任意二叉树T 中结点的程序。二叉树采用双链结构,结点形式为 (LSON,DATA,RSON)可采用任何你熟识的算法语言,设T 指向二叉树的根结点。 (12 分) 28.设一棵二叉树以二叉链表为存贮结构,结点结构为(lchild, data,rchild),设计一个 算法将二叉树中所有结点的左,右子树相互交换。 (10 分) 类似本题的另外叙述有: (1)设t 为一棵二叉树的根结点地址指针,试设计一个非递归的算法完成把二叉树中每个 结点的左右孩子位置交换。、 (14 分) (2)写一个将二叉树中每个结点的左右孩子交换的算法。(10 分) 29.设T 是一棵满二叉树,编写一个将T 的先序遍历序列转换为后序遍历序列的递归算法。 (15 分) 30.已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算 法。(12 分) 31.设二叉树采用二叉链表作为存储结构。试用类PASCAL 语言实现按前序遍历顺序输出二 叉树中结点的非递归算法。要求定义所用结构。设栈已经定义:inits(S),empty(S) push(S,P),pop(S),top (S)分别为栈初始化,判栈空,入栈,出栈,看栈顶等操作。(10 分) 32.已知深度为h 的二叉树以一维数组BT(1:2h-1)作为其存储结构。请写一算法,求该二叉 树中叶结点的个数。 33.设某二叉树结点结构为: TYPE bitreptr=^bnodetp; bnodetp=RECORD data:integer; lchild,rchild:bitreptr END; 试编写算法,计算每层中结点data 域数值大于50 的结点个数, 并输出这些结点的data 域的数值和序号。 (10 分) 34.编写递归程序将二叉树逆时针旋转90 度打印出来。如图:(要求用类C 语言,并描述结 构)。(6 分) 35.二叉树排序方法如下: (1)将第一个数据放在树根。 (2)将随后读入的数据与树根中的数据相比较,若比树根大,则置于右子树,反之则置于 左子树,建成一棵二叉树; (3)利用中序遍历打印排序结果。 试用PASCAL 或C 语言编写二叉树的排序程序,并分析其算法复杂性。(15 分) 36.已知一二叉树中结点的左右孩子为left 和right,p 指向二叉树的某一结点。请编一个 非递归函数postfirst(p),求p 所对应子树的第一个后序遍历结点。 (10 分) 37.已知二叉树T 的结点在先根次序下的排列为A[1],A[2],…,A[n],在中根次序下的排 列为B[1],B[2],…,B[n],其中,A 和B 是一维数组,数组元素的值为T 中相应的结点的INFO 字段的值,并假定二叉树T 中结点的INFO 字段的值互不相同,n>=0。试解答: (1)证明由A[1:n]和B[1:n]能唯一的确定二叉树T 的结构; (2)给出建造二叉树T 的算法,要求所建造的二叉树以LLINK/RLINK 链接结构表示,且该算 法是非递归算法; (3) 分析你所给算法的时间复杂性,该过程包括如何确定基本运算如何推导出期望复杂性和 最坏复杂性。(20 分) 38.已知一具有n 个结点的二叉树的中序遍历序列与后序遍历序列分别存放于数组IN[1:n] 和POST[1:n]中,(设该二叉树各结点的数据值均不相同)。请写一建立该二叉树的二叉链 表结构的非递归算法。该二叉链表的链结点结构为(lchild,data,rchild),其中data 为数 据域,lchild 与rhild 分别为指向该结点左、右孩子的指针域(当孩子结点不存在时,相应 指针域为空,用nil 表示)。(15 分) 39.试写出复制一棵二叉树的算法。二叉树采用标准链接结构。(10 分)。 类似本题的另外叙述有: (1)已知二叉树T,试写出复制该二叉树的算法(t→T) (1)(8 分)递归算法(2)(12 分)非递归算法【北方交通大学 1993 七(20 分)】 (2)算法题(共20 分,每题10 分) (1)试写出一递归函数,判别两棵树是否相等。 (2)试写出一递归函数,复制一棵二叉树。(20 分) 40.假设一维数组H[1:n]存放森林F 的每个结点的地址,且序列H[1],H[2],…,H[n]正 好是森林F 在先根次序下结点地址的排列;E[1:n]是一维数组,且当1<=i<=n 时,E[i]是H[i] 所指结点的次数(即儿子结点的个数)。试给出一个算法,该算法计算森林F 的树形个数, 并计算森林F 的最后一个树形的根结点地址。 (15 分) 41.请设计一个算法,要求该算法把二叉树的叶子结点按从左到右的顺序连成一个单链表, 表头指针为head。 二叉树按二叉链表方式存储,链接时用叶子结点的右指针域来存放单链 表指针。分析你的算法的时、空复杂度。(13 分) 类似本题的另外叙述有: (1)已知二叉树的链表存储结构定义如下: TYPE bitreptr=^bitrenode; bitrenode=RECORD data:char; lchild,rchild:bitreptr END; 编写一个递归算法,利用叶结点中空的右链指针域rchild,将所有叶结点自左至右链接成一 个单链表,算法返回最左叶结点的地址(链头)。 (10 分) 42.设二叉树以二叉链表示。使用类PASCAL 语言编一过程,输出二叉树中各结点的数据及 其所在的层数(已知一棵二叉树按中序遍历时各结点被访问的次序和这棵二叉树按后序遍历 时各结点被访问的次序,是否唯一确定这棵二叉树的结构?为什么?若已知一棵二叉树按先 序遍历时各结点被访问的次序和这棵二叉树按后序遍历时各结点访问的次序,能否唯一确定 这棵二叉树的结构?为什么?) (12 分) 43.写一非递归遍历算法,使图树遍历输出顺序为字母顺序。 (10 分) 44.二叉树结点的平衡因子(bf)定义为该结点的左子树高度与右子树高度之差。设二叉树 结点结构为:(lchild,data,bf,rchild),lchild,rchild 是左右儿子指针;data 是数据元 素;bf 是平衡因子,编写递归算法计算二叉树中各个结点的平衡因子。(18 分) 类似本题的另外叙述有: (1)设二叉树结点结构为(left,data,bf,right)。 定义二叉树结点T 的平衡因子bf(T)=hl-hr, 写一递归算法确定二叉树tree 中各结点的平衡因子bf,同时返回二叉树中非叶结点个数。 (15 分) 45.已知二叉树T 采用二叉链表结构存储,每个结点有三个字段:data,Lchild 和 Rchild 。设计算法求出T 的顺序存储结构A[1..n],并给出初始调用形式。要求:如某位置 为空,将其置为null;如超出下标范围n,则报错;最后返回实际的最大下标.右图所示为n=15 时一个二叉树及所对应的输出结果示例(空缺表示null)。输出结果(表结构的值和最大下 标):=12(最大下标为12)(8 分) 46.设两棵二叉树的的根结点地址分别为p 和q,采用二叉链表的形式存储这两棵树上所有 的结点。请编写程序,判断它们是否相似。 (8 分) 类似本题的另外叙述有: (1)编写一个函数或过程判定两棵二叉树是否相似,所谓两棵二叉树s 和t 相似,即是要么 它们都为空或都只有一个结点,要么它们的左右子树都相似。9 分) (2)设计判断两棵二叉树是否相似的算法。 (10 分) 47.编写递归算法,依据树的双亲表示法及其根结点创建树的孩子-兄弟链表存储结构。要 求写算法以前先写出这两种存储结构的类型说明。 (20 分) 48.已知二叉树以二叉链表存储,编写算法完成:对于树中每一个元素值为x 的结点,删去 以它为根的子树,并释放相应的空间。 (14 分) 类似本题的另外叙述有: (1)设T 是一棵给定的查找树,试编写一个在树中删除根结点为a 的子树的程序,要求在删除 的过程中释放该子树所有结点所占有的存储空间,这里假设树T 中结点所占有的存储空间是 通过动态存储分配取得的,其结点的形式为:(lchild,data,rchild) (15 分) 49.试为二叉树写出一个建立三叉链表的算法,并在此三叉链表中删去每一个元素值为x 的结点,以及以它为根的子树,且释放相应存储空间。二叉树的三叉链表的描述为: TYPE bitreptr=^nodetp; nodetp=RECORD data:char; lchild,rchild,parent:bitreptr END; VAR bt:bitreptr; (14 分) 50.设一棵二叉树的根结点指针为T,C 为计数变量,初值为0,试写出对此二叉树中结点计 数的算法:BTLC(T,C)。(10) 51.试编写算法,对一棵以孩子—兄弟链表表示的树统计叶子的个数。(15 分) 52.设计算法:统计一棵二叉树中所有叶结点的数目及非叶结点的数目。 53.用类PASCAL 语言编写一非递归算法,求二叉树上叶子结点的数量。二叉树用二叉链表 存贮,左指针定义为lchild,右指针定义为rchild。(8 分) 类似本题的另外叙述有: (1)用递归方法求已知二叉树的叶结点个数。 54.一棵二叉树以二叉链表来表示,求其指定的某一层k(k>1)上的叶子结点的个数。 (18 分) 55.二叉树采用二叉链表方式存放,对二叉树从1 开始进行连续编号,要求每个结点的编号 大于其左、右孩子的编号,同一个结点的左右孩子中,其左孩子的编号小于其右孩子的编号, 请回答采用什么次序的遍历方式实现编号?并给出在二叉树中结点的数据域部分填写实现 如上要求编号的非递归算法。 56.设一棵二叉树中各结点的值互不相同,其前序序列和中序序列分别存于两个一维数组 pre[1..n ]和mid[1..n ]中,试遍写算法建立该二叉树的二叉链表。(10 分) 类似本题的另外叙述有: (1)已知一棵二叉树的先序遍历序列和中序遍历序列分别存于两个一维数组中,试编写算 法建立该二叉树的二叉链表。 (12 分) (2)已知一棵二叉树的前序序列和中序序列分别存于两个一维数组PRE[1..n]和INO[1..n] 中,请编写算法来建立该二叉树的二叉链表。 (8 分) (3)已知一棵二叉树的前序序列和中序序列,可唯一地确定该二叉树。试编写据此思想构 造二叉树的算法。 (20 分) 57.已知二叉树的中序遍历序列为GFBEANHM,后序遍历的结点序列为GEBFHNMA。 (1)画出此二叉树的形态。(2)写出根据二叉树的中序和后序遍历的结点序列,建立它的 二叉链表存储结构的递归算法。(20 分) 58.假设二叉树采用链式存储结构进行存储,root^为根结点,p^为任一给定的结点,请写 出求从根结点到p^之间路径的非递归算法。 (9 分) 59.设二叉树的结点具有如下的结构:(lchild,info,rchild),指针变量BT 指向该树的 根结点,试设计一个算法打印出由根结点出发到达叶结点的所有路径。 (16 分) 60.设二叉树的结点结构是(Lc,data,Rc),其中Lc、Rc 分别为指向左、右子树根的指针, data 是字符型数据。试写出算法,求任意二叉树中第一条最长的路径长度,并输出此路径 上各结点的值。 (20 分) 61.设t 是一棵按后序遍历方式构成的线索二叉树的根结点指针,试设计一个非递归的算法, 把一个地址为x 的新结点插到t 树中,已知地址为y 的结点右侧作为结点y 的右孩子,并使 插入后的二叉树仍为后序线索二叉树。(15 分) 62.请用类C语言编写算法。请编写在中序全线索二叉树T 中的结点P 下插入一棵根为X的中 序全线索二叉树的算法。如果P 左右孩子都存在,则插入失败并返回FALSE;如果P 没有左 孩子,则X 作为P 的左孩子插入;否则X 作为P 的右孩子插入。插入完成后要求二叉树保持 中序全线索并返回TRUE。(10 分) 63.有中序穿索树T,结点形式为:(LL,LT,D,RT,RL),试编写非递归算法找到数据域为 A的结点,并在其左子树中插入已知新结点X:插入方式如下: 注意:可能A有左孩子或无左孩子,插入后考虑穿索的状态应作何修改。 (17 分) 64.编写一算法,利用叶子结点中的空指针域将所有叶子结点链接为一个带有头结点的双链 表,算法返回头结点的地址。 (13 分) 65.编写程序段,利用中序全线索树求其中任意结点p^的前序后继结点,结果仍用p 指出。 要求先描述结构和算法思路。设线索树不带头结点,其中序序列第一结点的左标志和最后结 点的右标志皆为0(非线索),对应指针皆为空。 (10 分) 66.已知一个二叉树如下图,修改结点(node)的连接方式,以致可以不借助辅助堆栈实现 中序遍历的非递归方法。画出修改后的结点连接图并写出其实现中序遍历的非递归算法。 (10 分) 67.已知指针p 指向带表头的中根次序穿线二叉树中的某结点,试写一算法FFA(p,q), 该算法寻找结点p 的父亲结点q 。设穿线二叉树的结点结构、表头结点结构和空树结构分别 为(LTAG,LLINK,INFO,RLINK,RTAG),且规定穿线树的最左下结点的LLINK 域和最右下结点 的RLINK 域指向表头。(16 分) 68. 给出中序线索树的结点结构并画出一个具有头结点的中序线索树,使其树结点至少应有 6 个。写一算法在不使用栈和递归的情况下前序遍历一中序线索树,并分析其时间复杂性。 (20 分) 69.设有二叉树BT,每个结点包括ltag、lchild、data、rchild、rtag 五个字段,依次为 左标志、左儿子、数据、右儿子、右标志。给出将二叉树BT 建成前序(即先序)线索二叉 树的递归算法。 (15 分) 70.写出中序线索二叉树的线索化过程(已知二叉树T)。(10 分) 71.已知一中序线索二叉树,写一算法完成对它的中序扫描。 (8 分) 72.已知中序线索二叉树T 右子树不空。设计算法,将S 所指的结点作为T 的右子树中的一 个叶子结点插入进去,并使之成为T 的右子树的(中序序列)第一个结点(同时要修改相应 的线索关系)。(8 分) 73.写出算法,求出中序线索二叉树中给定值为x 的结点之后继结点,返回该后继结点的指 针。线索树中结点结构为:(ltag,lc,data,rc,rtag)。其中,data 存放结点的值;lc,rc 为指向左、右孩子或该结点前驱或后继的指针;ltag,rtag 为标志域,各值为:0,则lc, rc 为指向左、右孩子的指针;值为1,则lc,rc 为指向某前驱后继结点的指针。(20 分) 74.设后序线索树中结点构造为(Ltag,Lchild,Data,Rchild,Rtag)。其中:Ltag,Rtag 值为0 时,Lchild、Rchild 分别为儿子指针;否则分别为直接前驱,直接后继的线索。请写出在后 序线索树上找给定结点p^ 的直接前驱q 的算法。(13 分) 75.用算法说明在对称序穿线树中,如何对任意给定的结点直接找出该结点的对称序后继。 (10 分) 76.写出在中序线索二叉树里;找指定结点在后序下的前驱结点的算法。 (10 分) 77.设中序穿线二叉树的结点由五个域构成:info:给出结点的数据场之值。LL:当LT 为1 时,则给出该结点的左儿子之地址,当LT 为0 时,则给出按中序遍历的前驱结点的地址。LT: 标志域,为1 或为0。RL:当RT 为1 时,则给出该结点的右儿子的地址;当RT 为0 时,则给 出按中序遍历的后继结点地址。RT:标志域为0 或为1。请编写程序,在具有上述结点结构的 中序穿线二叉树上,求某一结点p 的按后序遍历次序的后继结点的地址q,设该中序穿线二 叉树的根结点地址为r。另外,请注意必须满足:(1)额外空间的使用只能为O(1),(2)程 序为非递归。 (20 分) 78.写出按后序序列遍历中序线索树的算法。 (15 分) 79.给定一组项及其权值,假定项都存放于二叉树的树叶结点,则具有最小带权外部路径长 度的树称为huffman 树。(1)给出构造huffman 树 的算法。(2)给定项及相应的权如下表: 画出执行上述算法后得到的huffman 树。(3)用c 语言编写构造huffman 树的程序. (18 分) 80、二叉树T 的中序遍历序列和层次遍历序列分别是BAFDGCE 和ABCDEFG,试画出该二叉树 (3 分),并写出由二叉树的中序遍历序列和层次遍历序列确定二叉树的算法(5 分)。