数据结构练习4二叉树Word格式文档下载.docx
《数据结构练习4二叉树Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构练习4二叉树Word格式文档下载.docx(6页珍藏版)》请在冰豆网上搜索。
(A)50(B)99(C)100(D)101
7.设二叉树的深度为h,且只有度为1和0的结点,则此二叉树的结点总数为C。
(A)2h(B)2h-1(C)h(D)h+1
8.对一棵满二叉树,m个树叶,n个结点,深度为h,则D。
(A)n=h+m(B)h+m=2n(C)m=h-1(D)n=2h-1
9.某二叉树的先序序列和后序序列正好相反,则下列说法错误的是A。
(A)二叉树不存在
(B)若二叉树不为空,则二叉树的深度等于结点数
(C)若二叉树不为空,则任一结点不能同时拥有左孩子和右孩子
(D)若二叉树不为空,则任一结点的度均为1
10.对二叉树的结点从1开始进行编号,要求每个结点的编号大于其左右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用C遍历实现编号。
(A)先序(B)中序(C)后序(D)层序
11.一个具有1025个结点的二叉树的高h为C。
(A)10(B)11(C)11~1025(D)10~1024
12.设n,m为一棵二叉树上的两个结点,在中序遍历时,n在m前的条件是C。
(A)n在m右方(B)n是m祖先
(C)n在m左方(D)n是m子孙
13.实现对任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳方案是二叉树采用C存储结构。
(A)二叉链表(B)广义表(C)三叉链表(D)顺序
14.一棵树可转换成为与其对应的二叉树,则下面叙述正确的是A。
(A)树的先根遍历序列与其对应的二叉树的先序遍历相同
(B)树的后根遍历序列与其对应的二叉树的后序遍历相同
(C)树的先根遍历序列与其对应的二叉树的中序遍历相同
(D)以上都不对
二、填空题
1.对一棵具有n个结点的二叉树,当它为一棵完全二叉树时具有最小高度;
当它为单分支时,具有最大高度。
2.在二叉树的第i(i≥1)层上至多有2i-1个结点,深度为k(k≥1)的完全二叉树至多2k-1个结点,最少2k-1个结点;
3.如果二叉树的终端结点数为n0,度为2的结点数为n2,则n0n2+1。
4.已知一棵二叉树的中序序列是cbedahgijf,后序序列是cedbhjigfa,则该二叉树的先序序列是abcdefghij,该二叉树的深度为5。
5.若一棵二叉树的中序遍历结果为ABC,则该二叉树有5中不同的形态。
6.在顺序存储的二叉树中,下标为i和j的两个结点处在同一层的条件是log2i=log2j。
7.已知完全二叉树的第7层有8个结点,则其叶子结点数为36个。
总结点数为71个。
8.在对二叉树进行非递归中序遍历过程中,需要用栈来暂存所访问结点的地址;
进行层序遍历过程中,需要用队列来暂存所访问结点的地址;
9.高度为h,度为k的树中至少有h+k-1个结点,至多有(kn-1)/(k-1)个结点。
10.一维数组存放完全二叉树:
ABCDEFGHI,则后序遍历该二叉树的序列为HIDEBFGCA。
三、应用题
1.应用题:
说明分别满足下列条件的二叉树各是什么?
⑴先序遍历和中序遍历相同;
⑵中序遍历和后序遍历相同;
(3)先序遍历和后序遍历相同;
思考:
TLR、LTR、LRT
(1)空树、只有根结点、右单分支二叉树;
(2)空树、只有根结点、左单分支二叉树
(3)空树、只有根结点
2.已知一棵二叉树的中序序列是cbedahgijf,后序序列是cedbhjigfa,画出这棵二叉树的逻辑结构图。
3.一棵二叉树的先序、中序、后序序列如下,其中一部分未标出,试构造出该二叉树。
先序序列:
ABCDEFGHIJK
中序序列:
CBEDFAHJKIG
后序序列:
CEFDBKJIHGA
4.有n个结点的二叉树,已知叶子结点个数为n0,回答下列问题:
(1)写出求度为1的结点的个数n1的计算公式;
(2)若此树是深度为k的完全二叉树,写出n为最小的公式;
(3)若二叉树中仅有度为0和度为2的结点,写出求该二叉树结点个数n的公式;
(1)记度为2的结点个数为n2,则n=n0+n1+n2,另一方面,除了根结点以外,其余结点均有父结点的分支射出,所以结点数n=1+n1+2*n2;
综合上面两式可得n1=n+1-2n0。
(2)当树是深度为k的完全二叉树时,n的最小值nmin=2k-1;
(3)当二叉树中仅有度为0和2的结点时,二叉树的结点个数n=2n0-1。
四、算法设计题
1.编写求二叉树BT中结点总数的算法。
intBTreeCount(BTreeNode*BT){//二叉树中结点的总数
if(BT==NULL)
return0;
elseif(BT->
left==NULL&
&
BT->
right==NULL)
return1;
else
returnBTreeCount(BT->
left)+BTreeCount(BT->
right)+1;
}
2.编写求二叉树BT中叶子结点数的算法。
intBTreeCount(BTreeNode*BT)//二叉树中结点的总数
{
right);
3.若已知两棵二叉树BT1和BT2皆为空,或者皆不为空且BT1的左、右子树和BT2的左、右子树分别相似,则称二叉树BT1和BT2相似。
编写算法,判别给定的两棵二叉树是否相似。
intBTreeSim(BTreeNode*BT1,BTreeNode*BT2)//判断两棵二叉树是否相似
if(!
BT1&
!
BT2)return1;
elseif(!
BT1||!
BT2)return0;
returnBTreeSim(BT1->
lchild,BT2->
lchile)&
BTreeSim(BT1->
rchild,BT2->
rchild);
4.编写算法,求二叉树中以元素值为x的结点为根的子树的深度。
intGet_Sub_Depth(BTreeNode*BT,ElemTypex)//值为x的结点为根的子树的深度
BT)return0;
data==x)returnDepthBTree(BT);
lchild!
=NULL)returnGet_Sub_Depth(BT->
lchild,x);
rchild!
rchild,x);
elsereturn0;
intDepthBTree(BTreeNode*BT){//求二叉树BT的深度
//空树深度为0
else{
intdep1=DepthBTree(BT->
lchiid);
//先求根结点左子树的深度
intdep2=DepthBTree(BT->
//再求根结点右子树的深度
if(dep1>
dep2)//返回最大值,并加上根结点这一层
returndep1+1;
returndep2+1;
5.编写算法,计算二叉树中度为1的结点数和度为2的结点数。
ints1=0,s2=0;
voidBTreebranch(BTreeNode*BT){
if(BT!
=NULL){
if(BT->
=NULL)s2++;
elses1++;
BTreebranch(BT->
lchild);
=NULL)s1++;
6.试利用栈的基本操作编写一个先序遍历的非递归算法。
若二叉树非空,首先访问根结点并将其地址进栈,然后沿着左链遍历根结点的左子树。
若二叉树为空,则弹出栈顶元素,取得最近访问过的根结点地址,然后沿右链遍历根结点的右子树。
【算法源代码】
voidPreOrder(BTreeNode*BT){
InitStack(S);
Push(S,T);
while(!
StackEmpty(S)){
while(gettop(S,p)&
p){
visit(p->
data);
Push(S,p->
}//向左走到尽头
Pop(S,p);
//向右走一步
}//while