当前位置:文档之家› 数据结构第四章树和二叉树习题

数据结构第四章树和二叉树习题

04树和二叉树【单选题】1. 下列选项中不属于树形结构逻辑特征的是(C)。

A、有的结点有多个直接后继B、有的结点没有直接后继C、有的结点有多个直接前驱D、有的结点没有直接前驱2. 下列叙述中错误的是(B)。

A、树的度与该树中结点的度的最大值相等B、二叉树就是度为2的有序树C、有5个叶子结点的二叉树中必有4个度为2的结点D、满二叉树一定是完全二叉树3. 一棵二叉树中第6层上最多有(C)个结点。

A、2B、31C、32D、644. 一棵高为k的二叉树最少有(B)个结点。

A、k-1B、kC、k+1D、2k-1E、2k-15. 一棵高为k的二叉树最多有(C)个结点。

A、k+1B、2k-1C、2k-1D、2kE、2k+16. 一棵高为k的完全二叉树最少有(B)个结点。

A、2k-1-1B、2k-1C、2k-1D、2k7. 一棵高为k的完全二叉树最多有(C)个结点。

A、2k-1-1B、2k-1C、2k-1D、2k8. 一棵度为3的树中,度为3的结点有2个,度为2的结点有2个,度为1的结点有2个,则度为0的结点有(D)个。

A、4B、5C、6D、79. 含1000个结点的完全二叉树的高度为(B)。

A、9B、10C、11D、1210. 设完全二叉树T中含有n个结点,对这些结点从0开始按层序进行编号,若编号为i的结点有左孩子,则左孩子的编号为(D)。

A、2(i-1)B、2i-1C、2iD、2i+1E、2(i+1)11. 已知一算术表达式的中缀形式为A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为(D)。

A、-A+B*C/DEB、-A+B*CD/EC、-+*ABC/DED、-+A*BC/DE13. 先序遍历与中序遍历所得遍历序列相同的二叉树为(D )。

A 、根结点无左孩子的二叉树B 、根结点无右孩子的二叉树C 、所有结点只有左子树的二叉树D 、所有结点只有右子树的二叉树14. 下列叙述中正确的是(D )。

A 、由先序遍历序列和后序遍历序列可以惟一确定一棵二叉树B 、由森林转化而得的二叉树,其根结点一定有右子树C 、完全二叉树一定是满二叉树D 、在结点数目相同的二叉树中,完全二叉树的路径长度最短15. 由树转换而得的二叉树,根结点(B )。

A 、没有左子树B 、没有右子树C 、左右子树都有D 、视树的形态而定16. 由一个非空森林转换而得的二叉树,其根结点(D )。

A 、一定没有左子树B 、一定没有右子树C 、左右子树一定都有D 、左、右子树可能都有,也可能都没有17. 度为m 的赫夫曼树中,若叶子结点个数为n ,则非叶结点个数为(C )。

A 、n-1B 、m-1C 、[(n-1)/(m-1)]D 、[n/(m-1)]-1E 、[(n+1)/(m+1)]-1【填空题】1. 森林是(m 棵互不相交的树的集合,其中m ≥0)。

2. 在k 叉树的第i 层上最多有(k i-1)个结点。

3. 一棵高为k 的m 叉树中最少有(k )个结点,最多有(11--m m k )个结点。

4. 具有2400个结点的完全二叉树的深度为(12)。

5. 若二叉树T 有n 个叶子结点,则T 必有(n-1)个度为2的结点。

6. 一棵深度为k 且有(2k -1)个结点的二叉树称为满二叉树。

7. 设对完全二叉树T 上的结点按层序进行连续编号,根结点的编号为1。

若编号为i 的结点有双亲,则其双亲的编号为(⎣⎦2i );若编号为i 的结点有左孩子,则其左孩子的编号为(2i );若编号为i 的结点有右孩子,则其右孩子的编号为(2i+1)。

8. 对树进行后序遍历等价于对由该树转换而得的二叉树进行(中)序遍历;对树进行先序遍历等价于对由该树转换而得的二叉树进行(先)序遍历。

9. 对森林进行后序遍历等价于对由该森林转换而得的二叉树进行(中)序遍历;对森林进行先序遍历等价于对由该森林转换而得的二叉树进行(先)序遍历。

【计算题】1. 画出所有先序遍历序列为ABCD 的二叉树。

解:A(#,B(#,C(#,D)))、A(#,B(#,C(D,#)))、A(#,B(C,D))、A(#,B(C(#,D),#))、A(#,B(C(D,#),#))、A(B,C(#,D))、A(B,C(D,#))、A(B(#,C),D)、A(B(C,#),D)、A(B(#,C(#,D)),#)、A(B(#,C(D,#)),#)、A(B(C,D),#)、A(B(C(#,D),#),#)、A(B(C(D,#),#),#)。

2. 一棵深度为h 的满k 叉树有如下性质:第h 层上的结点都是叶子结点,其余各层上的每个结点都有k 个孩子结点。

若按层序从1开始对全部结点编号,则:(1)第i 层上有多少个结点?(2)编号为p 的结点的第i 个孩子结点(若存在)的编号是多少?(3)编号为p 的结点的双亲结点(若存在)的编号是多少?解:(1)第1层有1个结点,第i 层结点数=第i-1层结点数*k (2≤i ≤h ),可得第i 层结点数为1-i k 个。

(2)当根结点以及前面的p-1个结点的孩子都编了号之后,才开始为结点p 的孩子编号,可得结点p 的第i 个孩子的编号为(1+(p-1)*k)+i 。

(3)若p=1,则为根结点,无双亲,否则可设双亲结点编号为s,由⑵可知结点s 的孩子结点的编号范围为(s-1)*k+2~(s-1)*k+k+1,即k k p s k p 21-+≤≤-,又由s 为整数,可得⎥⎦⎥⎢⎣⎢-+=k k p s 2(p ≠1)。

3. 一棵含n 个结点的k 叉树,可能达到的最大深度是多少,可能达到的最小深度是多少?。

解:可能达到的最大深度是n ,最小深度是⎡⎤)1)1((log +-k n k 。

4. 已知一棵度为k 的树中有n 1个度为1的结点,n 2个度为2的结点,…,n k 个度为k 的结点,则该树有多少叶子结点?解:1*)1(1+-∑=k i i n i 。

5. 设树T 中有n 个结点,且所有分支结点的度均为k ,试求T 中叶子结点个数。

解:k n n 1--。

6. 已知完全二叉树T 上共有900个结点,试求:(1)T 的高度;(2)T 中叶子结点个数;(3)T 中度为1的结点个数。

解:⑴10;⑵450;⑶1。

7. 按层序对深度为k 的完全二叉树中全部结点从1开始编号,试求叶子结点可能的最小编号。

解:122+-k 。

8. 由遍历序列画出二叉树/树/森林。

(1)设一棵二叉树的先序序列为ABCDEFG,中序序列为CBEDFAG,试画出该二叉树。

(2)设一棵二叉树的中序序列为DBGEHAFCI,后序序列为DBHEBFICA,试画出该二叉树。

(3)已知树的先序遍历序列为GFKDAIEBCHJ,树的后序遍历序列为DIAEKFCJHBG,试画出该树。

(4)已知森林的先序遍历序列为ABCDEFGHIJKL,后序遍历序列为CBEFDGAJIKLH,试画出该森林。

(5)已知二叉树的层序序列为ABCDEFGHIJ,中序序列为DBGEHJACIF,试画出该二叉树。

解:(1)(2)(3)(4)(5)9. 设有二叉树如下:(1)试写出该二叉树的先、中、后、层序遍历序列;(2)试画出对应的先、中、后序线索二叉树存储结构。

(2)先序线索二叉树:中序线索二叉树:后序线索二叉树:10. 试将如下森林转为二叉树。

解:11. 试将下图中的树转为二叉树。

解:12. 设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07、0.19、0.02、0.06、0.32、0.03、0.21、0.10,试为这8个字母设计赫夫曼编码。

解:设8个字母为a、b、c、d、e、f、g、h,以出现频率为权值可构造赫夫曼树如下,然后以左分支表0,右分支表1,由根结点到字母所在叶子结点的路径,可得对应01串,此即该字母的赫夫曼编码(a:1010b:00c:10000d:1001e:11f:10001g:01h:1011)。

【算法题】下列算法题中可能用到的类如下:public class BiTreeNode {//二叉结点类public String data; //数据元素是长度为1的大写字母串public BiTreeNode lchild;public BiTreeNode rchild;public BiTreeNode(String d){ data=d; lchild=null; rchild=null; }}//BiTreeNodepublic class BiTree {//二叉链表类private BiTreeNode root;public BiTree(){root=null;}}//BiTreepublic abstract class Stack{//抽象栈类public abstract boolean isEmpty();public abstract boolean isFull();public abstract boolean push(Object k);public abstract Object pop();public abstract Object get();}//Stackpublic class OnelinkNode{//链栈结点类public Object data;public OnelinkNode next;public OnelinkNode(Object obj){ data=obj; next=null; }}//OnelinkNodepublic class OnelinkStack extends Stack{//链栈类private OnelinkNode head;public OnelinkStack(){ head=new OnelinkNode(null); }…//Stack中各抽象方法的实现}//OnelinkStack1. 在BiTree类中添加符合如下要求的构造函数:(1)由二叉树的广义表表示串(例如“A(B,C(#,D))”)生成对应的二叉链表;(2)由二叉树的中序和后序遍历序列串生成对应的二叉链表;(3)由一个二叉链表复制生成一个值相同的二叉链表。

2. 在BiTree类中添加实现如下功能的方法:(1)分别统计二叉树中度为2、度为1和度为0的结点的个数;(2)设二叉树上各数据元素的值各不相同,试求值为"X"的数据元素所在的层次值;(3)求二叉树的高解:(5)在BiTreeNode类中加入:public void alte( ){if (lchild!=null) lchild.alte(); //处理左子树if (rchild!=null) rchild.alte(); //处理右子树BiTreeNode temp;//交换当前结点左、右子树temp=lchild;lchild=rchild;rchild=temp;}在BiTree类中加入:public void alte(){ if (root!=null) root.alte(); }3. 设完全二叉树的顺序存储结构类SqTree定义如下:public class SqTree{private String[ ] table;private int len;public SqTree(int maxsize){table=new String[maxsize];len=0;}//构造函数public String getElem(int i){if (i<0||i>=table.length) return null; else return table[i];}//getElempublic int getLen(){return len;}}//SqTree试设计BiTree类的构造函数,由完全二叉树的顺序存储生成对应的二叉链表。

相关主题