#数据结构#第五章:二叉树

判断题

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.(k​h−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.(k​h−1−1)/(k−1)+1
B.(k​h−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, 2​h​−1
B.2h−1, 2​h−1
C.2h−1, 2​h−1−1
D.2​h−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;
}

发布了145 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43476037/article/details/102534783
今日推荐