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

前言

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

文章目录

  • 前言
  • 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.mzph.cn/news/229919.shtml

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

相关文章

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《市场环境下考虑全周期经济效益的工业园区共享储能优化配置》

这个标题涉及到工业园区中共享储能系统的优化配置&#xff0c;考虑了市场环境和全周期经济效益。以下是对标题中各个要素的解读&#xff1a; 市场环境下&#xff1a; 指的是工业园区所处的商业和经济背景。这可能包括市场竞争状况、电力市场价格波动、政策法规等因素。在这一环…

WordCloud—— 词云

【说明】文章内容来自《机器学习入门——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 wordcloud 是python的第三方库&#xff0c;称为词云&#xff0c;也成文字云&#xff0c;可以根据文本中的词频以直观和艺术化的形式展示文本中词语的重要性。 依赖于pillow …

kotlin 基础概览

继承类/实现接口 继承类和实现接口都是用的 : &#xff0c;如果类中没有构造器 ( constructor )&#xff0c;需要在父类类名后面加上 () &#xff1a; class MainActivity : BaseActivity(), View.OnClickListener 空安全设计 Kotlin 中的类型分为「可空类型」和「不可空类型」…

浏览器js中添加日志断点

一、需求 本地调试时&#xff0c;可以直接代码里使用console.log直接调试&#xff1b; 代码已更新到服务器&#xff0c;不想要提交代码&#xff0c;如何通过添加console.log调试呢 二、实现 使用浏览器添加日志断点的方式&#xff0c;当然vue这种打包的不可行哦 设置完成后…

【算法】bfs与dfs算法解决FloodFill(洪流)问题(C++)

文章目录 1. 什么是FloodFill问题2. 用什么方法解决FloodFill问题3. 具体例题773.图像渲染200.岛屿数量695.岛屿的最大面积130.被围绕的区域 1. 什么是FloodFill问题 一般floodfill问题可以描述为&#xff1a;给定一个二维矩阵&#xff0c;其中每个元素代表一个像素点&#xf…

setXxx getXxx 封装

1.封装介绍 封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作[方法],才能对数据进行操作。 2.封装的理解和好处 (1)隐藏实现细节 方法(连接数据库)<-----调用(传入参数...) 只负责调…

寻找最大整数 C语言xdoj51

问题描述 从键盘输入四个整数&#xff0c;找出其中的最大值并将其输出。 输入说明 输入4个整数&#xff0c;用空格分隔 输出说明 输出值最大的一个整数 输入样例 25 99 -46 0 输出样例 99 #include <stdio.h>//寻找最大整数 int main() {int i, a[4]…

【Gradle】运行时一直要下载 gradle-8.5-bin.zip

如何解决 Downloading https://services.gradle.org/distributions/gradle-8.5-bin.zip 的问题 文章目录 1. 问题描述2. 解决方法1&#xff09;找到 gradle-wrapper.properties2&#xff09;修改 distributionUrl 对应的值 3. 验证 1. 问题描述 在执行 gradlew 命令的时候&…

【数据结构】(堆)Top-k|堆排序

目录 概念&#xff1a; 堆的实现 构建 初始化 销毁 插入元素 往上调整 删除堆顶元素 往下调整 返回堆顶元素 返回有效个数 是否为空 堆排序 Top-k问题 ​编辑 创建数据 堆top-k 概念&#xff1a; 堆是将数据按照完全二叉树存储方式存储到一维数组中&#xff…

[计网00] 计算机网络开篇导论

目录 前言 计算机网络的概念 计算机网络的分层 计算机网络的分类 网络的标准化工作和相关组织 计算机网络的性能指标 前言 计算机网络在我们的日常生活中无处不在 在网络会有各种各样的协议和封装 保证我们的信息完整,无误的在各个客户端之前传输 计算机网络的概念 四…

从文字下乡到人人学英语

从建国到改革开放&#xff0c;从恢复高考到新式教育改革&#xff0c;中国飞速发展&#xff0c;文字需求也在不断增大&#xff0c;在“地球村”的时代下&#xff0c;我们要“习文字之变&#xff0c;顺时代发展。” 古言道&#xff1a;“仓颉作书&#xff0c;后稷作稼”&#xff…

UE4 去除重复纹理

如果直接连的话&#xff0c;效果如下&#xff1a; 就存在很多重复的纹理&#xff0c;如何解决这个问题呢&#xff1f; 将同一个纹理&#xff0c;用不同的Tilling&#xff0c;将Noise进行Lerp两者之间&#xff0c;为什么要这么做呢&#xff1f;因为用一个做清晰纹理&#xff0c;…

设计模式——命令模式

引言 命令模式是一种行为设计模式&#xff0c; 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中&#xff0c; 且能实现可撤销操作。 问题 假如你正在开发一款新的文字编辑器&#xff0c; …

C语言—小小圣诞树

这个代码会询问用户输入圣诞树的高度&#xff0c;然后根据输入的高度在控制台上显示相应高度的圣诞树。 #include <stdio.h>int main() {int height, spaces, stars;printf("请输入圣诞树的高度: ");scanf("%d", &height);spaces height - 1;st…

Linux---远程登录、远程拷贝命令

1. 远程登录、远程拷贝命令的介绍 命令说明ssh远程登录scp远程拷贝 2. ssh命令的使用 ssh是专门为远程登录提供的一个安全性协议&#xff0c;常用于远程登录&#xff0c;想要使用ssh服务&#xff0c;需要安装相应的服务端和客户端软件&#xff0c;当软件安装成功以后就可以使…

论文阅读《DPS-Net: Deep Polarimetric Stereo Depth Estimation》

论文地址&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/html/Tian_DPS-Net_Deep_Polarimetric_Stereo_Depth_Estimation_ICCV_2023_paper.html 概述 立体匹配模型难以处理无纹理场景的匹配&#xff0c;现有的方法通常假设物体表面是光滑的&#xff0c;或者光照是…

express中实现将mysql中的数据导出为excel

express中实现将mysql中的数据导出为excel 安装node-excel cnpm install node-xlsx -S封装公用的导出方法 /*** 查询* param tableName: 表名* param sqlJson&#xff1a;需要拼接的SQL* returns {Promise<unknown>}*/ const find (tableName, sqlJson) > {return…

Linux——权限

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C语言小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、 Linux下用户的分类 Linux下有两种用户&#xff1a; 1. root&#xff08;超级管理员用户…

基于FPGA的HDMI编码模块设计(包含工程源文件)

前文已经通过FPGA实现了TMDS视频编码的算法&#xff0c;也对单沿数据采样转双沿数据采样的ODDR原语做了详细讲解和仿真验证&#xff0c;本文将这些模块结合&#xff0c;设计出HDMI编码模块&#xff0c;在HDMI接口的显示器上显示一张图片。 1、整体思路 如图1所示&#xff0c;是…

Github 2023-12-18 开源项目周报 Top14

根据Github Trendings的统计&#xff0c;本周(2023-12-18统计)共有14个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量TypeScript项目4Python项目4Jupyter Notebook项目3非开发语言项目1JavaScript项目1Rust项目1Go项目1 基于项目…