【数据结构初阶 8】二叉树练习题

文章目录

  • 🌈 01. 求二叉树结点个数
  • 🌈 02. 求二叉树叶结点个数
  • 🌈 03. 求二叉树的高度
  • 🌈 04. 求第 k 层结点个数
  • 🌈 05. 查找值为 x 的结点
  • 🌈 06. 判断是否是单值二叉树
  • 🌈 07. 判断两棵树是否相同
  • 🌈 08. 判断是否是对称二叉树
  • 🌈 09. 另一棵树的子树
  • 🌈 10. 判断是否为完全二叉树

🌈 01. 求二叉树结点个数

  • 一棵二叉树的结点个数组成为:1 个根结点 + 左子树结点个数 + 右子树结点个数。
int TreeSize(TreeNode* root)
{//二叉树结点个数 = 左子树的结点个数 + 右子树结点个数 + 根结点return NULL == root ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}

🌈 02. 求二叉树叶结点个数

  • 二叉树的叶结点个数 = 左子树叶结点 + 右子树的叶结点。
  • 只有左右孩子域皆为空的即为叶结点。
int TreeLeafSize(TreeNode* root)
{// 为空的结点肯定不是叶结点if (NULL == root){return 0;}// 左右孩子同时为空的结点位叶子结点if (NULL == root->left && NULL == root->right){return 1;}// 左右子树的叶子结点相加即为二叉树的总叶节点数量return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

🌈 03. 求二叉树的高度

  • 如果当前树为空树,则返回 0
  • 如果当前树不为空,当前树高度 = 最大子树高度 + 1 (根)
int TreeHeigh(TreeNode* root)
{	if (NULL == root)			// 当前结点为空的话即当前树为空树{return 0;}int left = (root->left);	// 记录左子树的高度int right = (root->right);	// 记录右子树的高度return Left > Right ? Left + 1 : Right + 1;
}

🌈 04. 求第 k 层结点个数

  1. 如果树为空,则返回为 0;如果 k 为第一层,则返回 1。
  2. 如果上述两种情况都不是,求以当前结点开始的第 k 层结点个数可以分化为求当前结点的左右子树的第 k - 1 层结点个数。
  3. 重复递归执行第二步,直到分治到 k 为 1 或 0 为止。

在这里插入图片描述

int TreeLevelKSize(TreeNode* root, int k)
{assert(k > 0);		// 不存在第 0 层if (NULL == root)	// 空树结点个数为 0{return 0;	}if (1 == k)			// 每棵子树的第一层都是 1 个结点{return 1;	}return TreeLevelKSize(root->left, k - 1) + TreeLevelKSize(root->right, k - 1);
}

🌈 05. 查找值为 x 的结点

  • 当结点的值与 x 相等时,返回该节点,否则去其左右子树中寻找,若未找到,则返回空。
TreeNode* TreeFind(TreeNode* root, BTDataType x)
{// 当前结点为空则返回 NULLif (NULL == root)		{return NULL;}// 当前结点值和 x 相等时返回该结点if (root->data == x)	{return root;}// 去当前结点的左子树寻找,若不为空则说明找到了TreeNode* LeftRet =  TreeFind(root->left, x);if (LeftRet != NULL)	{return LeftRet;}// 去当前结点的右子树寻找,若不为空则说明找到了TreeNode* RightRet = TreeFind(root->right, x);if (RightRet != NULL)	{return RightRet;}// 当前子树的根结点以及其左右子树都未找到时返回 NULLreturn NULL;	
}

🌈 06. 判断是否是单值二叉树

单值二叉树

  • 二叉树中每个结点的值都相同,即为单值二叉树。

解题思路

  • 将一棵完整二叉树拆成若干份小二叉树,每个小二叉树包含 根结点、左孩子、右孩子 三部分。
  • 让每棵小树的根结点分别与其左右孩子比较,有不相等的值则返回 false,如果相等则继续对左右子树执行该步骤,直到走到空为止。

在这里插入图片描述

bool isUnidataTree(TreeNode* root)
{if (NULL == root){return true;}// 左孩子不为空,但是左孩子的值与根节点不同if (root->left && root->data != root->left->data){return false;}// 右孩子不为空,但是右孩子的值与根节点不同if (root->right && root->data != root->right->data){return false;}// 按照上述方法查找大二叉树的每棵小树,只要有一个返回 false 就会一路返回 falsereturn isUnidataTree(root->left) && isUnidataTree(root->right);
}

🌈 07. 判断两棵树是否相同

  1. 判断两棵树相同位置的结点是否同时为空。
  2. 判断两棵树相同位置的非空结点的值是否相同。
  3. 对这两棵树中的所有子树采用上述步骤。
bool isSameTree(TreeNode* p, TreeNode* q)
{// 两个相同位置结点都为空时自然相同if (NULL == p && NULL == q){return true;}// 如果两个相同位置的结点不是同时为空,两棵树肯定不相同if ((NULL == p && NULL != q) || (NULL != p && NULL == q)){return false;}// 判断相同位置结点的值是否相等if (p->data != q->data){return false;}// 重复上述步骤,如果有一个地方返回 false,则一直返回 falsereturn isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

🌈 08. 判断是否是对称二叉树

  • 一个关于中心轴对称的二叉树称为对称二叉树。

在这里插入图片描述

实现思路

  • 将二叉树拆分成 根节点、左子树、右子树 三部分,每棵子树都能拆成这三部分。
  • 让左子树的根和右子树的根比较;让左子树的左子树和右子树的右子树比较;让左子树的右子树和右子树的左子树比较。

代码实现

bool _isSymmetric(TreeNode* left, TreeNode* right)
{// 两个子树的根结点都为空时对称if (NULL == left && NULL == right){return true;}// 相对称位置结点如果不是同时为空则结果肯定不对称if ((NULL == left && right != NULL) || (NULL == right && left != NULL)){return false;}// 相对位置都不为空且值不相等时不对称if (left->data != right->data){return false;}// 让左右子树的相对称位置的结点执行上述步骤return _isSymmetric(left->left, right->right) && _isSymmetric(left->right, right->left);
}bool isSymmetric(TreeNode* root)
{// 判断大二叉树的左右子树是否对称return _isSymmetric(root->left, root->right);
}

🌈 09. 另一棵树的子树

  • 判断一棵小树是不是另一棵大树的子树。

在这里插入图片描述

实现思路

  • 将大二叉树拆分成 根节点、左子树、右子树 三部分。大树的所有子树都可拆成这三部分。
  • 在大树的这三部分去找与小树相同的子树。

代码实现

// 判断两棵树是否相同
bool isSameTree(TreeNode* p, TreeNode* q)
{//两个结点都为空时自然相同if (NULL == p && NULL == q){return true;}//如果两个相同位置的结点不是同时为空,两棵树肯定不相同if ((NULL == p && NULL != q) || (NULL != p && NULL == q)){return false;}//判断相同位置结点的值是否相等if (p->data != q->data){return false;}//重复上述步骤,如果有一个地方返回 false,则一直返回 falsereturn isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}bool isSubtree(TreeNode* root, TreeNode* subRoot)
{if (NULL == root){return false;}// 将大二叉树拆成根节点、左子树、右子树 三部分,去和小二叉树比较return isSameTree(root, subRoot) || isSubtree(root->left, subRoot) ||isSubtree(root->right, subRoot);
}

🌈 10. 判断是否为完全二叉树

  • 此功能实现要借助数据结构的队列

实现思路

  • 因为完全二叉树中的所有结点都是连续的。
  • 将二叉树中所有的结点 (包括空结点) 按照层序的方式依次入队列。
  • 然后将队列中的结点依次出队,如果出到了 NULL 则停止出队。
  • 此时再查看队列中是否还有非空结点 (表示不连续),如果有,则该二叉树不是完全二叉树。

举个例子

在这里插入图片描述

代码实现

bool BinaryTreeComplete(TreeNode* root)
{Queue q;						// 创建队列QueueInit(&q);					// 队列初始化if (root)						// 根结点非空时入队列{QueuePush(&q, root);}while (!QueueEmpty(&q))			// 队列非空则二叉树没有遍历完{TreeNode* front = QueueFront(&q);QueuePop(&q);				// 队头出队列if (NULL == front)			// 出到 NULL 时结束出队列{break;}QueuePush(&q, front->left);	// 将包含 NULL 在内的当前出队结点的 左孩子 入队QueuePush(&q, front->right);// 将包含 NULL 在内的当前出队结点的 右孩子 入队}while (!QueueEmpty(&q))			// 队列非空时判断是否还有非 NULL 元素{TreeNode* front = QueueFront(&q);QueuePop(&q);				// 不停出队列用于检查是否有空结点if (front)					// 出现不是 NULL 说明不是完全二叉树{QueueDestroy(&q);		// 销毁队列return false;			// 非完全二叉树}}QueueDestroy(&q);				// 销毁队列return true;					// 是完全二叉树
}

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

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

相关文章

单片机05__串口USART通信__按键控制向上位机传输字符串

串口USART通信 通用UART介绍 1.通信的概念 计算机与外界进行信息交换的过程称之为通信。 在通信的过程中,通信双方都需要遵守的规则称之为通信协议。 硬件协议:将数据以什么样的方式传输过去 软件协议:将数据以什么样的顺序传输过去 2.常用…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月26日,星期一

每天一分钟,知晓天下事! 2024年2月26日 星期一 农历正月十七 1、 气象台:3月初之前南方大部将维持阴雨雪天气。 2、 据海关统计,京津冀协同发展十年成效显著,外贸总量跨两个万亿台阶。 3、 2024年研考初试成绩今天起…

逆向茶话会笔记

安卓逆向 用用burp设置代理或者用charles抓包 windows httpopen 类比web站点渗透测试 推荐书 飞虫 安卓大佬不怎么打ctf 喜欢在看雪和吾爱破解 提问环节 q websocket grpc抓包有什么推荐的工具? a 不太了解 游戏安全和llvm 既要逆游戏也要逆外挂 逆游戏入…

自己测试CSDN质量分3

你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好 质量分测试网址

【Leetcode】938. 二叉搜索树的范围和

文章目录 题目思路代码结论 题目 题目链接 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1: 输入:root [10,5,15,3,7,null,18], low 7, high 15 输出:32 示例 2: 输入…

【VSCode】解决VSCode远程连接问题:远程主机可能不符合 glibc 和 libstdc++

今天用VSCode进行ssh连接时,提示“远程主机可能不符合 glibc 和 libstdc VSCode 服务器的先决条件”。查了一下发现这个问题主要是由于VSCode在一月份发布的最新版本v1.86中要求远程主机 glibc>2.28导致的,所以ssh连接Ubuntu 18.04的时候就会提示这个…

apachectl: line 79: 20233 Segmentation fault (core dumped) $HTTPD “$@“

[TOC](apachectl: line 79: 20233 Segmentation fault (core dumped) $HTTPD “$”) 1、问题描述 apache 启动报错 apachectl: line 79: 20233 Segmentation fault (core dumped) $HTTPD “$” 2、问题分析 参考链接: https://stackoverflow.com/questions/43726930/apache…

【JVM】线上一次fullGC排查思路

fullGC问题背景 监控告警发现,今天开始我们线上应用频繁出现fullGC,并且每次出现后磁盘都会被占满 查看监控 查看监控发现FULLGC的机器均为同一个机房的集器,并且该机房有线上error报错,数据库监控对应的时间点也有异常&#x…

sonar-java 手写一个规则-单元测试分析

前言 最近做项目,定制sonar规则,提高Java代码质量,在编写的sonar规则,做验证时,使用单元测试有一些简单的心得感悟,分享出来。 自定义规则模式 sonar的自定义规则很简单,一般而言有2种模式可…

JAVA工程师面试专题-《Mysql》篇

目录 一、基础 1、mysql可以使用多少列创建索引? 2、mysql常用的存储引擎有哪些 3、MySQL 存储引擎,两者区别 4、mysql默认的隔离级别 5、数据库三范式 6、drop、delete 与 truncate 区别? 7、IN与EXISTS的区别 二、索引 1、索引及索…

数据库应用:Windows 部署 MySQL 8.0.36

目录 一、实验 1.环境 2.Windows 部署 MySQL 8.0.36 3.Windows配置环境变量 4.Navicat链接MySQL 二、问题 1.安装MySQL 报错 一、实验 1.环境 (1)主机 表1 主机 主机软件版本IP备注WindowsMySQL8.0.36localhost 2.Windows 部署 MySQL 8.0.…

云原生之容器编排实践-ruoyi-cloud项目部署到K8S:MySQL8

背景 前面搭建好了 Kubernetes 集群与私有镜像仓库,终于要进入服务编排的实践环节了。本系列拿 ruoyi-cloud 项目进行练手,按照 MySQL , Nacos , Redis , Nginx , Gateway , Auth ,…

顺序表知识点——顺序表的增删查改

目录 准备文件 创建顺序表蓝图 顺序表初始化函数接口 顺序表的销毁函数接口 顺序表的打印函数接口 顺序表的插入函数接口 顺序表的删除函数接口 从本节开始, 复习数据结构。 空间复杂度还有时间复杂度之后利用例题学习。 这节先学习顺序表的增删查改。 首…

Android Gradle开发与应用 (二) : Groovy基础语法

1. Groovy是什么 Groovy是基于JVM虚拟机的一种动态语言,语法和Java非常相似,并能够无缝地与Java代码集成和互操作,增加了很多动态类型和灵活的特性。(闭包、DSL) 语法和Java非常相似这个特点,意味着,如果我们完全不懂…

[ffmpeg] x264 配置参数解析

背景 创建 x264 编码器后,其有一组默认的编码器配置参数,也可以根据需要修改参数,来满足编码要求。 具体参数 可修改的参数,比较多,这边只列举一些常用的。 获取可以配置的参数 方式1 查看 ffmpeg源码 libx264.c…

通用检测大模型 | 华科白翔团队提出以对象为中心的基础模型GLEE

本文首发: AIWalker https://arxiv.org/abs/2312.09158 https://glee-vision.github.io AIWalker后台回复【GLEE】即可下载原文与译文。 在这项工作中,我们提出了GLEE:一个对象级的基础模型,用于定位和识别图像和视频中的对象。 通过一个统一…

第二节:Vben Admin 登录逻辑梳理和对接后端准备

系列文章目录 上一节:第一节:Vben Admin介绍和初次运行 文章目录 系列文章目录前言项目路径的概述一、登录逻辑梳理loginApi接口查看Mock 二、后端程序对接准备关闭Mock 总结 前言 第一节,我们已经配置了前端环境,运行起来了我们…

查看笔记本电池健康状态-windows11

在 Windows 11 中获取详细的电池报告 Windows 11 中内置的 Powerfg 命令行选项来生成电池报告。 在任务栏上选择“搜索”,键入“cmd”,长按(或右键单击)“命令提示符”,然后选择“以管理员身份运行” ->“是”。 …

【Flink精讲】Flink性能调优:CPU核数与并行度

常见问题 举个例子 提交任务命令: bin/flink run \ -t yarn-per-job \ -d \ -p 5 \ 指定并行度 -Dyarn.application.queuetest \ 指定 yarn 队列 -Djobmanager.memory.process.size2048mb \ JM2~4G 足够 -Dtaskmanager.memory.process.size4096mb \ 单个 TM2~8G 足…

自动驾驶---行业发展及就业环境杂谈

进入21世纪以来,自动驾驶行业有着飞速的发展,自动驾驶技术(L2---L3)也逐渐落地量产到寻常百姓家。虽然最早期量产FSD的特斯拉有着深厚的技术积累,但是进入2010年以后,国内的公司也逐渐发展起来自己的自动驾…