第六章 树及二叉树.docx
- 文档编号:6912675
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:11
- 大小:77.58KB
第六章 树及二叉树.docx
《第六章 树及二叉树.docx》由会员分享,可在线阅读,更多相关《第六章 树及二叉树.docx(11页珍藏版)》请在冰豆网上搜索。
第六章树及二叉树
第六章树及二叉树
一、判断正误
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)/2
10、N个结点的二叉树采用二叉链表存放,共有空链域个数为n+1
11、深度为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、5
2、二叉树是非线性数据结构,所以(B)
A、它不能用顺序存储结构存储;B、顺序存储结构和链式存储结构都能存储;
C、它不能用链式存储结构存储;顺序存储结构和链式存储结构都不能使用
3、有n(n>0)个结点的完全二叉树的深度为(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、48
8、设森林F中有三棵树,第一、第二和第三棵树的结点个数分别为M1、M2和M3。
与森林F对应的二叉树根结点的右子树上的结点个数是(D)
A、M1B、M1+M2C、M3D、M2+M3
9、将一棵有100个结点的完全二叉树从根这一层开始,每一层从左到右依次对结点进行编号,根结点编号为1,则编号最大的非叶结点的编号为(C)
A、48B、49C、50D、51
10、引入二叉线索树的目的是(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、ADCFEG
15、有关二叉树下列说法正确的是(B)
A、二叉树的度为2B、一棵二叉树的度可以小于2
C、二叉树中至少有一个结点的度为2D、二叉树中任何一个结点的度都为2
16、一个具有1025个结点的二叉树的高h为(C)
A、11B、10C、11至1025之间D、10至1024之间
17、一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有(B)结点
A、2h B、2h-1C、2h+1D、h+1
18、对于有n个结点的二叉树,其高度为(D)
A、nlog2nB、log2nC、⎣log2n⎦|+1D、不确定
19、一棵具有n个结点的完全二叉树的树高度(深度)是(A)
A、⎣logn⎦+1B、logn+1C、⎣logn⎦D、logn-1
20、已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历是(D)。
A、acbedB、decabC、deabcD、cedba
21、若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用(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==NULL
C、t->Rtag==1且t->Rchild==NULLD、以上都不对
27、设给定权值总数有n个,其哈夫曼树的结点总数为(D)
A、不确定B、2nC、2n+1D、2n-1
28、利用二叉链表存储树,则根结点的右指针是(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的兄弟),并注意原有连线结点一律归入左子树,新添连线结点一律归入右子树。
A
B
EC
KFHD
LGI
MJ
5、画出和下列二叉树相应的森林。
答:
注意根右边的子树肯定是森林,而孩子结点的右子树均为兄弟。
五、算法设计题
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(d>p)p=d;/*向上回朔时,要挑出左右子树中的相对大的那个深度值*/
d=depth(root->rchild);
if(d>p)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_Depth
4、编写按层次顺序(同一层自左至右)遍历二叉树的算法。
解:
思路:
既然要求从上到下,从左到右,则利用队列存放各子树结点的指针是个好办法。
这是一个循环算法,用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);
}
}//LayerOrder
5、二叉树按二叉链表形式存储,编写算法判别给定二叉树是否为完全二叉树。
答:
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,p->lchild);
EnQueue(Q,p->rchild);//不管孩子是否为空,都入队列
}}//while
return1;
}//IsFull_Bitree
6、计算二叉树上单分支结点数目。
intOnchild(BiTreeT)//单分支节点的
{
intnum1,num2,n=0;
if(T==NULL)
return(0);
else
if((T->lchild==NULL&&T->rchild!
=NULL)||(T->lchild!
=NULL&&T->rchild==NULL))
n=1;
num1=Onchild(T->lchild);
num2=Onchild(T->rchild);
return(num1+num2+n);
}
7、写出在中序线索二叉树里;找指定结点在后序下的前驱结点的算法。
[题目分析]在后序序列中,若结点p有右子女,则右子女是其前驱,若无右子女而有左子女,则左子女是其前驱。
若结点p左右子女均无,设其中序左线索指向某祖先结点f(p是f右子树中按中序遍历的第一个结点),若f有左子女,则其左子女是结点p在后序下的前驱;若f无左子女,则顺其前驱找双亲的双亲,一直继续到双亲有左子女(这时左子女是p的前驱)。
还有一种情况,若p是中序遍历的第一个结点,结点p在中序和后序下均无前驱。
BiThrTreeInPostPre(BiThrTreet,p)
//在中序线索二叉树t中,求指定结点p在后序下的前驱结点q
{BiThrTreeq;
if(p->rtag==0)q=p->rchild; //若p有右子女,则右子女是其后序前驱
elseif(p->ltag==0)q=p->lchild; //若p无右子女而有左子女,左子女是其后序前驱。
else if(p->lchild==null)q=null;//p是中序序列第一结点,无后序前驱
else//顺左线索向上找p的祖先,若存在,再找祖先的左子女
{while(p->ltag==1&&p->lchild!
=null)p=p->lchild;
if(p->ltag==0)q=p->lchild; //p结点的祖先的左子女是其后序前驱
else q=null; //仅右单枝树(p是叶子),已上到根结点,p结点无后序前驱
}
return(q);}//结束InPostPre
8、线索二叉树有数据域data,左右孩子域lchild和rchild,左右标志ltag及rtag,规定标志为1对应的孩子域是线索,0则为指向孩子的指针。
规定在储存线索二叉树时,完成下面中序线索化过程。
(存储线索二叉树,不增加头结点,只在原有的由tree指向的二叉树中增加线索,线索化前所有的标志tag都是0)。
/*pre是同tree类型相同的指针,初值是null*/
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)_______);
}
}
(1)tree->lchild
(2)null(3)pre->rchild(4)pre->rtag=1(5)pre->right=tree;(6)tree->right(注(4)和(5)顺序可换)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六章 树及二叉树 第六 二叉