判断题
1-1.某二叉树的后序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无右孩子。 (2分)
T,分析见1-2
1-2.某二叉树的后序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无左孩子。 (2分)
F
假如存在左孩子,那么前序遍历的第一个元素肯定不等于中序遍历的第一个元素。我们分析第一层,假设根 节点的左子树不存在,那么总算前序遍历和中序遍历结果相等了,然后我们判断根节点的右子树部分,发现还是要 保证左子树不存在的。递归分析一定没有左孩子的
1-3.存在一棵总共有2016个结点的二叉树,其中有16个结点只有一个孩子。 (3分)
F
分支数B=n1 + 2n2, B = n -1 = 2015, n1为偶数,可推出矛盾
1-4.若A和B都是一棵二叉树的叶子结点,则存在这样的二叉树,其前序遍历序列为…A…B…,而中序遍历序列为…B…A…。 (2分)
F
1-5.若一个结点是某二叉树的中序遍历序列的最后一个结点,则它必是该树的前序遍历序列中的最后一个结点。 (2分)
F
1-6.某二叉树的前序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无左孩子。 (2分)
T,分析见1-2
1-7.已知一棵二叉树的先序遍历结果是ABC, 则CAB不可能是中序遍历结果。 (2分)
T
知道中序遍历和先序遍历,是可以画出树来的。如果不是很会这种方法,反正只有三个节点,大可以画图举例。可得没有树满足先序是ABC,中序是CAB的。
我们这样去分析:由先序遍历可得A是根节点;由中序遍历可得C是左孩子,B是右孩子,而先序遍历中B是左孩 子,C是右孩子,矛盾
单选题
2-1.如果一棵非空k(k≥2)叉树T中每个非叶子结点都有k个孩子,则称T为正则k叉树。若T的高度为h(单结点的树h=1),则T的结点数最多为:(3分)
A.(kh −1)/(k−1)
B.(kh−1−1)/(k−1)
C.(kh+1−1)/(k−1)
D.以上都不是
A,可将k=2带入
2-2.如果一棵非空k(k≥2)叉树T中每个非叶子结点都有k个孩子,则称T为正则k叉树。若T的高度为h(单结点的树h=1),则T的结点数最少为:(3分)
A.(kh−1−1)/(k−1)+1
B.(kh−1)/(k−1)−1
C.kh
D.k(h−1)+1
D
2-3.要使一棵非空二叉树的先序序列与中序序列相同,其所有非叶结点须满足的条件是:(2分)
A.只有左子树
B.只有右子树
C.结点的度均为1
D.结点的度均为2
B
2-4.已知一棵二叉树的树形如下图所示,其后序序列为{ e, a, c, b, d, g, f }。树中与结点a同层的结点是:(3分)
A.c
B.d
C.f
D.g
B
2-5.在下述结论中,正确的是: (2分)
① 只有2个结点的树的度为1;
② 二叉树的度为2;
③ 二叉树的左右子树可任意交换;
④ 在最大堆(大顶堆)中,从根到任意其它结点的路径上的键值一定是按非递增有序排列的。
A.①④
B.②④
C.①②③
D.②③④
A
2-6.若一棵二叉树的后序遍历序列是{ 1, 3, 2, 6, 5, 7, 4 },中序遍历序列是{ 1, 2, 3, 4, 5, 6, 7 },则下列哪句是错的?(3分)
A.这是一棵完全二叉树
B.2是1和3的父结点
C.这是一棵二叉搜索树
D.7是5的父结点
A
2-7.如果一棵非空k(k≥2)叉树T中每个非叶子结点都有k个孩子,则称T为正则k叉树。若T有m个非叶子结点,则T中的叶子结点个数为:(3分)
A.mk
B.m(k−1)
C.m(k−1)+1
D.m(k−1)−1
C
n=B+1=mk+1
n=n0+nk
2-8.有一个四叉树,度2的结点数为2,度3的结点数为3,度4的结点数为4。问该树的叶结点个数是多少?(2分)
A.10
B.12
C.20
D.21
D
2-9.若一棵二叉树的前序遍历序列是{ 4, 2, 1, 3, 6, 5, 7 },中序遍历序列是{ 1, 2, 3, 4, 5, 6, 7 },则下列哪句是错的?(3分)
A.这是一棵完全二叉树
B.所有的奇数都在叶子结点上
C.这是一棵二叉搜索树
D.2是5的父结点
D
2-10.按照二叉树的定义,具有3个结点的二叉树有几种? (2分)
A.3
B.4
C.5
D.6
C
2-11.任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序 (2分)
A.发生改变
B.不发生改变
C.不能确定
D.以上都不对
B
2-12.二叉树中第5层(根的层号为1)上的结点个数最多为:(2分)
A.8
B.15
C.16
D.32
C
n5=25-1 =16
2-13.先序遍历图示二叉树的结果为 (2分)
A.A,B,C,D,H,E,I,F,G
B.A,B,D,H,I,E,C,F,G
C.H,D,I,B,E,A,F,C,G
D.H,I,D,B,E,F,G,A,C
B
2-14.三叉树中,度为1的结点有5个,度为2的结点3个,度为3的结点2个,问该树含有几个叶结点? (3分)
A.8
B.10
C.12
D.13
A
2-15.某二叉树的中序序列和后序序列正好相反,则该二叉树一定是 (2分)
A.空或只有一个结点
B.高度等于其结点数
C.任一结点无左孩子
D.任一结点无右孩子
C
2-16.某二叉树的前序和后序遍历序列正好相反,则该二叉树一定是 (2分)
A.空或只有一个结点
B.高度等于其结点数
C.任一结点无左孩子
D.任一结点无右孩子
B
2-17.设n、m为一棵二叉树上的两个结点,在中序遍历时,n在m前的条件是 (3分)
A.n在m左方
B.n在m右方
C.n是m祖先
D.n是m子孙
A
2-18.给定二叉树如下图所示。设N代表二叉树的根,L代表根结点的左子树,R代表根结点的右子树。若遍历后的结点序列为3、1、7、5、6、2、4,则其遍历方式是: (2分)
A.NRL
B.RNL
C.LRN
D.RLN
B
2-19.设高为h的二叉树(规定叶子结点的高度为1)只有度为0和2的结点,则此类二叉树的最少结点数和最多结点数分别为: (3分)
A.2h, 2h−1
B.2h−1, 2h−1
C.2h−1, 2h−1−1
D.2h−1+1, 2h−1
B
2-20.在下述结论中,正确的是: (2分)
①只有一个结点的二叉树的度为0;
②二叉树的度为2;
③二叉树的左右子树可任意交换;
④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A.①④
B.②④
C.①②③
D.②③④
A
函数题
6-1 求二叉树高度
本题要求给定二叉树的高度。
函数接口定义:
int GetHeight( BinTree BT );
其中 BinTree
结构定义如下:
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
要求函数返回给定二叉树BT的高度值。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree CreatBinTree(); /* 实现细节忽略 */
int GetHeight( BinTree BT );
int main()
{
BinTree BT = CreatBinTree();
printf("%d\n", GetHeight(BT));
return 0;
}
/* 你的代码将被嵌在这里 */
输出样例
4
参考代码
int GetHeight( BinTree BT )
{
int m, n;
if(BT == NULL)
return 0;
else
{
m = GetHeight(BT->Left);
n = GetHeight(BT->Right);
if(m > n)
return (m + 1);
else
return (n + 1);
}
}
6-2 二叉树的遍历
本题要求给定二叉树的4种遍历。
函数接口定义:
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
其中 BinTree
结构定义如下:
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
要求4个函数分别按照访问顺序打印出结点的内容,格式为一个空格跟着一个字符。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree CreatBinTree(); /* 实现细节忽略 */
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
int main()
{
BinTree BT = CreatBinTree();
printf("Inorder:"); InorderTraversal(BT); printf("\n");
printf("Preorder:"); PreorderTraversal(BT); printf("\n");
printf("Postorder:"); PostorderTraversal(BT); printf("\n");
printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输出样例
Inorder: D B E F A G H C I
Preorder: A B D F E C G H I
Postorder: D E F B H G I C A
Levelorder: A B C D F G I E H
参考代码
void InorderTraversal( BinTree BT )
{
if(BT)
{
InorderTraversal(BT -> Left);
printf(" %c", BT -> Data);
InorderTraversal(BT -> Right);
}
}
void PreorderTraversal( BinTree BT )
{
if(BT)
{
printf(" %c", BT -> Data);
PreorderTraversal(BT -> Left);
PreorderTraversal(BT -> Right);
}
}
void PostorderTraversal( BinTree BT )
{
if(BT)
{
PostorderTraversal(BT -> Left);
PostorderTraversal(BT -> Right);
printf(" %c", BT -> Data);
}
}
void LevelorderTraversal( BinTree BT )
{
BinTree p;
BinTree q[100];
int flag = 0, i = 0;
if(BT)
{
q[i++] = BT;
while(flag != i)
{
p = q[flag++];
printf(" %c", p -> Data);
if(p -> Left != NULL)
{
q[i++] = p -> Left;
}
if(p -> Right != NULL)
{
q[i++] = p -> Right;
}
}
}
}
6-3 先序输出叶结点
本题要求按照先序遍历的顺序输出给定二叉树的叶结点。
函数接口定义:
void PreorderPrintLeaves( BinTree BT );
其中 BinTree
结构定义如下:
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
函数PreorderPrintLeaves
应按照先序遍历的顺序输出给定二叉树BT的叶结点,格式为一个空格跟着一个字符。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree CreatBinTree(); /* 实现细节忽略 */
void PreorderPrintLeaves( BinTree BT );
int main()
{
BinTree BT = CreatBinTree();
printf("Leaf nodes are:");
PreorderPrintLeaves(BT);
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输出样例
Leaf nodes are: D E H I
参考代码
void PreorderPrintLeaves( BinTree BT )
{
if(BT)
{
if((BT -> Left == NULL) && (BT -> Right == NULL))
printf(" %c", BT -> Data);
PreorderPrintLeaves(BT -> Left);
PreorderPrintLeaves(BT -> Right);
}
}
编程题
6-2 二叉树的遍历
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。
输出格式:
在一行中输出Preorder:
以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。
输入样例
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例
Preorder: 4 1 3 2 6 5 7
参考代码
#include<bits/stdc++.h>
using namespace std;
int in[101],post[101];
typedef struct BiTNode{
int data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
BiTree Build(int *in,int *post,int n)
{
if(n <= 0)
return NULL;
int *p = in;
while(p){
if(*p == *(post + n - 1))
break;
p++;
}
BiTree T = new BiTNode;
T -> data = *p;
int len = p - in;
T -> lchild = Build(in, post, len);
T -> rchild = Build(p + 1, post + len, n - len - 1);
return T;
}
void PreorderPrintLeaves(BiTree T)
{
if(T){
printf(" %d",T -> data);
PreorderPrintLeaves(T->lchild);
PreorderPrintLeaves(T->rchild);
}
return;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n, i;
BiTree T;
cin>>n;
for(i = 0;i < n;i++)
scanf("%d",&post[i]);
for(i = 0;i < n;i++)
scanf("%d",&in[i]);
T = Build(in,post,n);
printf("Preorder:");
PreorderPrintLeaves(T);
return 0;
}