C语言数据结构-----二叉树(3)二叉树相关练习题

news2025/1/13 10:23:00

前言

前面详细讲述了二叉树的相关知识,为了巩固,做一些相关的练习题

文章目录

  • 前言
  • 1.某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为?
  • 2.下列数据结构中,不适合采用顺序存储结构的是?
  • 3.在具有 2n 个结点的完全二叉树中,叶子结点个数为?
  • 4.一棵完全二叉树的节点数位为531个,那么这棵树的高度为?
  • 5.一个具有767个节点的完全二叉树,其叶子节点个数为?
  • 6.单值二叉树
  • 7.相同的树
  • 8.对称二叉树
  • 9.二叉树的最大深度
  • 10.另一棵树的子树
  • 11.翻转二叉树
  • 12.二叉树的前序遍历
    • 12.1 二叉树的中序遍历
    • 12.2 二叉树的后序遍历
  • 13.平衡二叉树
  • 14.在一颗度为3的树中,度为3的结点有2个,度为2的结点有1个,度为1的结点有2个,则叶子结点有( )个
  • 15.设根结点的深度为1,则一个拥有n个结点的二叉树的深度一定在( )区间内
  • 16.一颗完全二叉树有1001个结点,其叶子结点的个数是( )
  • 17.一颗拥有1000个结点的树度为4,则它的最小深度是( )
  • 18.如果一颗二叉树的前序遍历的结果是ABCD,则满足条件的不同的二叉树有( )种
  • 19.已知某二叉树的前序遍历序列为5 7 4 9 6 2 1,中序遍历序列为4 7 5 6 9 1 2,则其后序遍历序列为( )
  • 20.已知某二叉树的前序遍历序列为ABDEC,中序遍历序列为BDEAC,则该二叉树( )
  • 21.已知某二叉树的中序遍历序列为JGDHKBAELIMCF,后序遍历序列为JGKHDBLMIEFCA,则其前序遍历序列为( )


在做题之前,需要补充二叉树的一条性质:对任何一棵二叉树, 如果度为0其叶结点个数为n0 , 度为2的分支结点个数为n2 ,则有:
n0=n2 +1

1.某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为?

A 不存在这样的二叉树
B 200
C 198
D 199

解析:B
叶子节点即为度为0的节点,由性质可知,叶子结点数=199+1=200

2.下列数据结构中,不适合采用顺序存储结构的是?

A 非完全二叉树
B 堆
C 队列
D 栈

解析:A
在这里插入图片描述

3.在具有 2n 个结点的完全二叉树中,叶子结点个数为?

A n
B n+1
C n-1
D n/2

解析:A
在这里插入图片描述

4.一棵完全二叉树的节点数位为531个,那么这棵树的高度为?

A 11
B 10
C 8
D 12

解析:B
在这里插入图片描述

5.一个具有767个节点的完全二叉树,其叶子节点个数为?

A 383
B 384
C 385
D 386

解析:B
在这里插入图片描述

6.单值二叉树

在这里插入图片描述

bool isUnivalTree(struct TreeNode* root) 
{
    if (root==NULL)
    return true;
    if (root->left!=NULL&&root->left->val!=root->val)
    return false;
    if (root->right!=NULL&&root->right->val!=root->val)
    return false;
    return isUnivalTree(root->left)&&isUnivalTree(root->right);
}

解析:
如果树为空,那么并不违反规则。
如果树的左边不为空,并且左边的值不等于root的值那么错误。右边同理。
最后对左子树和右子树递归调用!

7.相同的树

在这里插入图片描述

bool isSameTree(struct TreeNode* p, struct TreeNode* q) 
{
    if (p==NULL&&q==NULL)
    return true;
    if (p==NULL&&q!=NULL)
    return false;
    if (q==NULL&&p!=NULL)
    return false;
    if (p->val!=q->val)
    return false;

    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}

解析:先把几种特殊情况写了,就是pq都为空,p空q不空,q空p不空,pq都不空但值不相等。
写完了几种特殊情况就可以递归左子树和右子树判断了!

8.对称二叉树

在这里插入图片描述

bool doubleisSymmetric(struct TreeNode* root1,struct TreeNode* root2) 
{
    if (root1==NULL&&root2==NULL)
    return true;
    if (root1==NULL||root2==NULL)
    return false;
    if (root1->val!=root2->val)
    return false;

    return doubleisSymmetric(root1->left,root2->right)&&doubleisSymmetric(root1->right,root2->left);
}

bool isSymmetric(struct TreeNode* root)
{
    return doubleisSymmetric(root->left,root->right);
}

解析
在这里插入图片描述

9.二叉树的最大深度

在这里插入图片描述

int maxDepth(struct TreeNode* root)
{
    return (root==NULL)?0:fmax(maxDepth(root->left),maxDepth(root->right))+1;
}

解析:
用一个三目就可以解决,如果为空深度就为0,否则的话遍历左子树和右子树遍历一次+1,一直到底,左边和右边谁打谁就是深度。

10.另一棵树的子树

在这里插入图片描述

bool isSameTree(struct TreeNode* p, struct TreeNode* q) 
{
    if (p==NULL&&q==NULL)
    return true;
    if (p==NULL||q==NULL)
    return false;
    if (p->val!=q->val)
    return false;

    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{
    if(root==NULL)
    return false;
    
    if (root->val==subRoot->val)
    {
        if (isSameTree(root,subRoot))
        return true;
    }

    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

在这里插入图片描述

11.翻转二叉树

在这里插入图片描述
第一次写是这样的,但是发现这样写麻烦了,没必要直接写个swap函数,还调用二级指针麻烦!

void swap(struct TreeNode** a, struct TreeNode** b) {
    struct TreeNode* temp = *a;
    *a = *b;
    *b = temp;
}

struct TreeNode* invertTree(struct TreeNode* root) {
    if (root == NULL)
        return NULL;
    
    swap(&(root->left), &(root->right));
    
    invertTree(root->left);
    invertTree(root->right);
    
    return root;
}

修改一下,看着简单舒服多了

struct TreeNode* invertTree(struct TreeNode* root) 
{
        if (root == NULL) 
        return NULL;
         struct TreeNode* temp;
        temp=root->left;
        root->left=root->right;
        root->right=temp;
        invertTree(root->left);
        invertTree(root->right);
        return root;
}

到这里,这个级别的代码就应该不需要解析了吧,都能看懂。

12.二叉树的前序遍历

在这里插入图片描述

void preorder(struct TreeNode* root, int* res, int* resSize) 
{
    //root:当前节点的指针。
    //res:存储遍历结果的数组。
    //resSize:指向遍历结果数组元素个数的指针。
    if (root == NULL) 
        return;
    res[(*resSize)++] = root->val;
    preorder(root->left, res, resSize);
    preorder(root->right, res, resSize);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    int* res = malloc(sizeof(int) * 2000);
    *returnSize = 0;
    preorder(root, res, returnSize);
    return res;
}

12.1 二叉树的中序遍历

在这里插入图片描述

void inorder(struct TreeNode* root, int* res, int* resSize) 
{
    //root:当前节点的指针。
    //res:存储遍历结果的数组。
    //resSize:指向遍历结果数组元素个数的指针。
    if (root == NULL) 
        return;
    inorder(root->left, res, resSize);
      res[(*resSize)++] = root->val;
    inorder(root->right, res, resSize);
}

int* inorderTraversal(struct TreeNode* root, int* returnSize) 
{
    int* res = malloc(sizeof(int) * 2000);
    *returnSize = 0;
    inorder(root, res, returnSize);
    return res;
}

12.2 二叉树的后序遍历

在这里插入图片描述

void postorder(struct TreeNode* root, int* res, int* resSize) 
{
    //root:当前节点的指针。
    //res:存储遍历结果的数组。
    //resSize:指向遍历结果数组元素个数的指针。
    if (root == NULL) 
        return;
    postorder(root->left, res, resSize);
    postorder(root->right, res, resSize);
    res[(*resSize)++] = root->val;
}

int* postorderTraversal(struct TreeNo
de* root, int* returnSize) 
{
     int* res = malloc(sizeof(int) * 2000);
    *returnSize = 0;
    postorder(root, res, returnSize);
    return res;
}

这三道题如出一辙,所以我把他们放到一起。代码都很简单,大家应该都能看懂!

13.平衡二叉树

在这里插入图片描述

int TreeHeight(struct TreeNode* root)
{
	if (root == NULL)
		return 0;
	int leftHeight = TreeHeight(root->left);
	int rightHeight = TreeHeight(root->right);

	return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}


bool isBalanced(struct TreeNode* root) 
{
    	if (root == NULL)
		return true;
        else 
        return fabs(TreeHeight(root->left) - TreeHeight(root->right)) <= 1 
        && isBalanced(root->left) 
        && isBalanced(root->right);
}

解析:
先求二叉树的左高度和右高度,然后递归返回来判断是否满足题意。

14.在一颗度为3的树中,度为3的结点有2个,度为2的结点有1个,度为1的结点有2个,则叶子结点有( )个

A.4
B.5
C.6
D.7

解析:C
在这里插入图片描述

15.设根结点的深度为1,则一个拥有n个结点的二叉树的深度一定在( )区间内

A.[log(n + 1),n]
B.[logn,n]
C.[log(n + 1),n - 1]
D.[log(n + 1),n + 1]

解析:

最大深度: 即每次只有一个节点,次数二叉树的高度为n,为最高的高度
最小深度: 此树为完全二叉树, 如果是完全二叉树
根据二叉树性质,完全二叉树的高低为 h = log(n+1)向上取整

故答案为 [log(n + 1),n]

16.一颗完全二叉树有1001个结点,其叶子结点的个数是( )

A.251
B.500
C.501
D.不能确定

解析:C

完全二叉树的最后一个结点的编号一定是1001,则它的父结点的编号为1001/2=500,则叶子结点个数为1001-500=501.
总结一下:完全二叉树的最后一个结点的编号是n,则它的父结点的编号为[n/2],则叶子结点个数为n-[n/2]。

17.一颗拥有1000个结点的树度为4,则它的最小深度是( )

A.5
B.6
C.7
D.8

解析:B
如果这棵树每一层都是满的,则它的深度最小,假设它为一个四叉树,高度为h,则这个数的节点个数为(4^h - 1) / 3,当h = 5, 最大节点数为341, 当h = 6, 最大节点数为1365,所以最小深度应该为6。

18.如果一颗二叉树的前序遍历的结果是ABCD,则满足条件的不同的二叉树有( )种

A.13
B.14
C.15
D.16

解析:B
在这里插入图片描述

19.已知某二叉树的前序遍历序列为5 7 4 9 6 2 1,中序遍历序列为4 7 5 6 9 1 2,则其后序遍历序列为( )

A.4 2 5 7 6 9 1
B.4 2 7 5 6 9 1
C.4 7 6 1 2 9 5
D.4 7 2 9 5 6 1

解析:C
在这里插入图片描述

20.已知某二叉树的前序遍历序列为ABDEC,中序遍历序列为BDEAC,则该二叉树( )

A.是满二叉树
B.是完全二叉树,不是满二叉树
C.不是完全二叉树
D.是所有的结点都没有右子树的二叉树

解析:感觉有两种情况 B,C
在这里插入图片描述

21.已知某二叉树的中序遍历序列为JGDHKBAELIMCF,后序遍历序列为JGKHDBLMIEFCA,则其前序遍历序列为( )

A.ABDGHJKCEFILM
B.ABDGJHKCEILMF
C.ABDHKGJCEILMF
D.ABDGJHKCEIMLF

解析:B
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1318936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】MySQL表的操作-创建查看删除和修改

文章目录 1.创建表2.查看表结构3.修改表4.删除表 1.创建表 语法&#xff1a; CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明&#xff1a; field 表示列名datatype 表示列的类型…

GitHub推荐:下载工具-Motrix

项目地址 GitHub - agalwood/Motrix: A full-featured download manager. 项目简介 Motrix是一个开源的下载工具&#xff0c;支持BT下载、Magnet下载。且下载支持最高64个线程&#xff0c;基本可以说下载速度的上限取决于你的带宽。是一款很不错的下载工具。 项目截图

机器视觉技术与应用实战(Chapter Two-03)

2.5 图像滤波和增强 滤波的作用是&#xff1a;图像中包含需要的信息&#xff0c;也包含我们不感兴趣或需要屏蔽的干扰&#xff0c;去掉这些干扰需要使用滤波。 增强的作用是&#xff1a;通过突出或者抑制图像中某些细节&#xff0c;减少图像的噪声&#xff0c;增强图像的视觉效…

介绍strncpy函数

strncpy函数需要引用#include <string.h>头文件 函数原型&#xff1a; char *_Dest 是字符串的去向 char *_Source是字符串的来源 size_t_Count是复制字符串的大小 #include <stdio.h> #include <string.h> int main() { char arr[128] { \0 }; …

『亚马逊云科技产品测评』在当前飞速发展的AI人工智能时代云服务技术哪家强?

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 文章目录 引言一、亚马逊&阿里云发展历史介绍1.1 亚马逊发展历史1.2…

人工智能中的核心概念

1 概述 人工智能英文缩写为AI&#xff0c;是一种由人制造出来的机器&#xff0c;该机器可以模仿人的思想和行为&#xff0c;从而体现出一种智能的反应。 人工智能的产业链分为基础层、技术层、应用层三个层次。 基础层包括&#xff1a;芯片、大数据、算法系统、网络等多项基础…

云计算:Vmware 安装 FreeNAS

目录 一、实验 1.Vmware 安装 FreeNAS 2.配置Web界面 二、问题 1.iSCSI如何限定名称 2.LUN和LVM的区别 一、实验 1.Vmware 安装 FreeNAS &#xff08;1&#xff09;环境准备 VMware Workstation 17 FreeNAS相关安装部署镜像: 官网地址&#xff1a; https://download…

Amazon EC2使用测评

前言 每月/750小时为期 12 个月&#xff0c;通过 AWS 免费套餐使用创建就有750个小时的免费使用额度是真的很香&#xff0c;几乎可以免费使用一年&#xff0c;对于一些喜欢自己搭建博客的用户几乎是发福利&#xff0c;整整一年的免费使用&#xff0c;对于新手来说确实很好&…

Spring Boot+Mybatis设置sql日志打印

在全局配置文件添加以下内容&#xff1a;logging.level.com.demo.mapperdebug&#xff0c;com.demo.mapper&#xff1a;src下的mapper路径&#xff0c;debug&#xff1a;设置日志打印级别为debug&#xff0c;亦可设置为&#xff1a;ERROR、WARN、INFO application.properties …

【JAVA-Day68】异常处理的奥秘:深度解析 Java try-catch-finally 机制,高效应对异常问题

异常处理的奥秘&#xff1a;深度解析 Java try-catch-finally 机制&#xff0c;高效应对异常问题 &#x1f680; 异常处理的奥秘&#xff1a;深度解析 Java try-catch-finally 机制&#xff0c;高效应对异常问题 &#x1f680;摘要引言为什么要捕获异常 &#x1f60a;异常捕获的…

人工智能在金融与商业领域的智能化变革

导言 随着人工智能技术的不断发展&#xff0c;金融和商业领域正迎来一场智能化的变革。随着人工智能的不断发展&#xff0c;其在金融和商业领域的应用正成为业界瞩目的焦点。本文将深入探讨人工智能在金融和商业应用中的关键技术、应用场景以及对未来的影响。 1. 关键技术与算…

FPGA简易加减法计算器设计

题目要求&#xff1a; &#xff08;1&#xff09;设计10以内的加减法计算器。 &#xff08;2&#xff09;1个按键用于指定加法或减法&#xff0c;一个用于指定加数或被加数&#xff0c;还有两个分别控制加数或被加数的增加或减少。 &#xff08;3&#xff09;设置的结果和计算的…

饥荒Mod 开发(十三):木牌传送

饥荒Mod 开发(十二)&#xff1a;一键制作 饥荒Mod 开发(十四)&#xff1a;制作屏幕弹窗 一键传送源码 饥荒的地图很大&#xff0c;跑地图太耗费时间和饥饿值&#xff0c;如果大部分时间都在跑图真的是很无聊&#xff0c;所以需要有一个能够传送的功能&#xff0c;不仅可以快速…

一种解决Qt5发布release文件引发的无法定位程序输入点错误的方法

目录 本地环境问题描述分析解决方案 本地环境 本文将不会解释如何利用Qt5编译生成release类型的可执行文件以及如何利用windeployqt生成可执行的依赖库&#xff0c;请自行百度。 环境值操作系统Windows 10 专业版&#xff08;22H2&#xff09;Qt版本Qt 5.15.2Qt Creator版本5.0…

数字滤波器设计——Matlab实现数字信号处理<1>

目录 一.实验内容 二.代码分析 1.信号产生部分 2.利用傅立叶级数展开的方法&#xff0c;自由生成所需的x(t) 3.通过选择不同的采样间隔T&#xff08;分别选T>或<1/2fc&#xff09;&#xff0c;从x(t)获得相应的x(n) 3.对获得的不同x(n)分别作傅立叶变换&#xff0c…

[elementPlus] teleported 在 ElSubMenu中的用途

如图 一个菜单对应的路由结构如上图 如果做适配窄屏幕 如果在 <ElSubMenu :index"route.path" >中不加入 teleported 就会出现问题 加上就OK了 <ElSubMenu :index"route.path" teleported>

git 切换远程地址分支 推送到指定地址分支 版本回退

切换远程地址 1、切换远程仓库地址&#xff1a; 方式一&#xff1a;修改远程仓库地址 【git remote set-url origin URL】 更换远程仓库地址&#xff0c;URL为新地址。 git remote set-url https://gitee.com/xxss/omj_gateway.git 方式二&#xff1a;先删除远程仓库地址&…

前端对接 —— 周末

1.点击校验 点击校验 宇哥 记得过滤 不能校验的数据&#xff08;我后端还要检验吗&#xff1f;&#xff09; 2.前端数据对接 这个可以吗&#xff1f; 这种的可以吗&#xff1f;

基于多智能体系统一致性算法的电力系统分布式经济调度策略MATLAB程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 参考文献&#xff1a; 主要内容&#xff1a; 应用多智能体系统中的一致性算法&#xff0c;以发电机组的增量成本和柔性负荷的增量效益作为一致性变量&#xff0c;设计一种用于电力系统经济调度的算法&#x…