数据结构练习(二叉树)
学号 31301374 姓名 张一博 班级 软件工程1301 .
一、选择题
1.按照二叉树定义,具有3个结点的二叉树共有 C 种形态。
(A) 3 (B) 4 (C) 5 (D) 6
2.具有五层结点的完全二叉树至少有 D 个结点。
(A) 9 (B) 15 (C) 31 (D) 16
3.以下有关二叉树的说法正确的是 B 。
(A) 二叉树的度为2 (B)一棵二叉树的度可以小于2
(C) 至少有一个结点的度为2 (D)任一结点的度均为2
4.已知二叉树的后序遍历是dabec,中序遍历是debac,则其前序遍历是 D 。
(A)acbed (B)decab (C) deabc (D) cedba
5.将一棵有1000个结点的完全二叉树从上到下,从左到右依次进行编号,根结点的编号为1,则编号为49的结点的右孩子编号为 B 。
(A) 98 (B) 99 (C) 50 (D) 没有右孩子
6.对具有100个结点的二叉树,若有二叉链表存储,则其指针域共有 D 为空。
(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开始进行编号,要求每个结点的编号大于其左右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用 A 遍历实现编号。
(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)层上至多有 2^(i-1) 个结点,深度为k(k≥1)的完全二叉树至多 2^(k)-1 个结点,最少 2^(k-1) 个结点;
3.如果二叉树的终端结点数为n0,度为2的结点数为n2,则n0 = n2+1 。
4.已知一棵二叉树的中序序列是cbedahgijf,后序序列是cedbhjigfa,则该二叉树的先序序列是 abcdefghij ,该二叉树的深度为 5 。
5.若一棵二叉树的中序遍历结果为ABC,则该二叉树有 3 中不同的形态。
6.在顺序存储的二叉树中,下标为i和j的两个结点处在同一层的条件是 log(2)i=log(2)j 。
7.已知完全二叉树的第7层有8个结点,则其叶子结点数为 36 个。总结点数为 71 个。
8.在对二叉树进行非递归中序遍历过程中,需要用 栈 来暂存所访问结点的地址;进行层序遍历过程中,需要用 队列 来暂存所访问结点的地址;
9.高度为h,度为k的树中至少有 h+k-1 个结点,至多有 k^(h)-1 个结点。
10.一维数组存放完全二叉树:ABCDEFGHI,则后序遍历该二叉树的序列为 HIDEBFGCA 。
三、应用题
1. 应用题:说明分别满足下列条件的二叉树各是什么?
⑴先序遍历和中序遍历相同; 空树,只有一个跟节点或右单分支二叉树。
⑵中序遍历和后序遍历相同; 空树,只有一个根节点或左单分支二叉树。
⑶先序遍历和后序遍历相同; 空树,只有一个根节点的二叉树。
2. 已知一棵二叉树的中序序列是cbedahgijf,后序序列是cedbhjigfa,画出这棵二叉树的逻辑结构图。
A F
B G
C D H I
E J
3.一棵二叉树的先序、中序、后序序列如下,其中一部分未标出,试构造出该二叉树。
先序序列: A二叉树公式 B C D E F G H I J K
中序序列:C B E D F A H J K I G
后序序列: C E F D B K J I H G A
4.有n个结点的二叉树,已知叶子结点个数为n0,回答下列问题:
(1)写出求度为1的结点的个数n1的计算公式;
(2)若此树是深度为k的完全二叉树,写出n为最小的公式;
(3)若二叉树中仅有度为0和度为2的结点,写出求该二叉树结点个数n的公式;
(1) n1=n+1-2n0
(2) n(min)=2^(k-1)
(3) n=2n0-1
四、算法设计题
1.编写求二叉树BT中结点总数的算法。
int BTreeCount(BTreeNode *BT) //二叉树中结点的总数
{
if(BT==NULL)
return 0;
else if(BT->left==NULL&&BT->right==NULL)
return 1;
else
return BTreeCount(BT->left)+BTreeCount(BT->right)+1;
}
2.编写求二叉树BT中叶子结点数的算法。
int BTreeCount(BTreeNode *BT) //二叉树中结点的总数
{
if(BT==NULL)
return 0;
else if(BT->left==NULL&&BT->right==NULL)
return 1;
else
return BTreeCount(BT->left)+BTreeCount(BT->right);
}
3.若已知两棵二叉树BT1和BT2皆为空,或者皆不为空且BT1的左、右子树和BT2的左、右子树分别相似,则称二叉树BT1和BT2相似。编写算法,判别给定的两棵二叉树是否相似。
int BTreeSim(BTreeNode *BT1,BTreeNode *BT1)
{
if(! BT1 && ! BT2) return 1;
else if(! BT1||! BT2) return 0;
else
return BTreeSim(BT1->lchild,BT2->lchile)&&BTreeSim(BT1->rchild,BT2->rchild);
}
4.编写算法,求二叉树中以元素值为x的结点为根的子树的深度。
int BTreeSim(BTreeNode *BT , ElemType x)
{
if(! BT) return 0;
else if(BT->data==x) return DepthBTree(B)T;
else if(BT->lchild!=NULL) return Get_Sub_Depth(BT->lchild ,x);
else if(BT->rchild!=NULL) return Get_Sub_Depth(B)T->rchild,x;
else return 0;
}
int DepthBTree(BTreeNode *BT) //求二叉树BT的深度
{
if(!BT) return 0;
else{
int dep1=DepthBTree(BT->lchild);
int dep2=DepthBTree(BT->rchild);
if(dep1>dep2)
return dep1+1;
else
return dep2+1;
}
}
5.编写算法,计算二叉树中度为1的结点数和度为2的结点数。
int s1=0,s2=0;
void BTreebranch(BTreeNode *BT)
{
if(BT!=NULL){
if(BT->lchild!=NULL){
if(BT->rchild!=NULL) s2++;
else s1 ++;
BTreebranch(BT->lchild);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论