Java-数据结构-二叉树-习题(一) (✪ω✪)
文本目录:
❄️一、习题一(检查两颗树是否相同):
▶ 思路:
▶ 代码:
❄️二、习题二(另一棵树的子树):
▶ 思路:
▶ 代码:
❄️三、习题三(翻转二叉树):
▶ 思路:
▶ 代码:
❄️四、习题四(对称二叉树):
▶ 思路:
▶ 代码:
❄️五、习题五(平衡二叉树):
▶ 思路:
▶ 代码:
❄️六、习题六(二叉树的构建和遍历):
▶ 思路:
▶ 代码:
❄️七、总结:
❄️一、习题一(检查两颗树是否相同):
☑ 题的链接:
相同的树
▶ 思路:
这个题呢我们需要判断 两个二叉树的结构是否相同,并且节点的值是否相同,所以呢,我们遍历二叉树来看看 两个二叉树的所对应的结构和节点数值是否相同。
我们在结构上呢,我们有两种情况:
第一种:p 这个二叉树对应的节点不为空,q 这个二叉树对应的节点为空。
第二种:p 这个二叉树对应的节点为空,q 这个二叉树对应的节点不为空。
当我们这两个二叉树所对应的节点结构是都为空,或这都不为空的时候呢,就是我们的结构是一样的,之后我们再来判断这两个节点所对应的值是否相同。
所以呢我们是先来判断结构是否相同,之后判断节点的值是否相同。 这里呢,我们也使用的是递归方法。我们来看看思路图:
▶ 代码:
接下来我们来看看代码的编写:
public boolean isSameTree(TreeNode p, TreeNode q) {//先判断p和q的结构if (p != null && q == null || p == null && q != null) {//结构出现错误return false;}//可能是因为都为null或者都不为空//都为空下:if (p == null && q == null) {return true;}//都不为空//判断对相应的节点的值是否一样if (p.val != q.val) {return false;}//走到这,就是这个节点判断完成,并且是相同的,我们之后去其左子树和右子树检查return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);//我们递归正确返回的是真}
❄️二、习题二(另一棵树的子树):
☑ 题的链接:
另一棵树的子树
▶ 思路:
我们的这道题呢,和我们的上面的代码是有关系的,我们这到题呢也是需要对于节点的结构和对应的节点值进行比较,当我们在 root 里面遍历当我们的遍历出和我们的 subRoot 这个根结点相同的时候呢,我们进行 root 和 subRoot 共同遍历,在我们没有比较出和 subRoot 根结点相同之前呢,我们只有 root 遍历。
判断子树和当前的 root 的左子树一样?
判断子树和当前的 root 的右子树一样?
▶ 代码:
我们来看看代码是如何实现的:
public boolean isSameTree(TreeNode p, TreeNode q) {//先判断p和q的结构if (p != null && q == null || p == null && q != null) {//结构出现错误return false;}//可能是因为都为null或者都不为空//都为空下:if (p == null && q == null) {return true;}//都不为空//判断对相应的节点的值是否一样if (p.val != q.val) {return false;}//走到这,就是这个节点判断完成,并且是相同的,我们之后去其左子树和右子树检查return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);//我们递归正确返回的是真}//另一棵树的子树public boolean isSubtree(TreeNode root, TreeNode subRoot) {if (root == null) {return false;}if (isSameTree(root,subRoot)) {return true;}if (isSubtree(root.left,subRoot)) {return true;}if (isSubtree(root.right,subRoot)) {return true;}return false;}
❄️三、习题三(翻转二叉树):
☑ 题的链接:
翻转二叉树
▶ 思路:
这道题呢,还是非常简单的,我们只需要把根的左子树和右子树进行替换,之后我们遍历我们的左子树和右子树再执行替换操作。我们来看看思路:
▶ 代码:
我们来看看代码如何编写的:
public TreeNode invertTree(TreeNode root) {if (root == null) {return null;}//进行当前根的左子树和右子树的替换TreeNode cur = root.left;root.left = root.right;root.right = cur;//到根的左子树和右子树去替换//这里用遍历invertTree(root.left);invertTree(root.right);return root;}
❄️四、习题四(对称二叉树):
☑ 题的链接:
对称二叉树
▶ 思路:
我们这道题呢,和我们判断 两棵树是否相等 是相类似的,我们什么情况下我们的二叉树是对称的呢?在我们二叉树的 左右子树是在结构上和对应节点的值是相等的时候就是相等的,这时候呢,我们的二叉树就是对称二叉树。对称二叉树要注意的是:我们的左子树的节点应该和右子树的是相等的,而不是左子树节点和左子树节点相等。
我们先来看看不为对称二叉树的情况:
正确的情况图: 所以我们要判断:
1、根的左子树是否为空
2、根的右子树是否为空
3、左子树的节点的值和右子树的节点的值是否相等
这里我们要注意的是:
我们递归的时候呢,我们要判断 左子树的左子树和右子树的右子树。左子树的右子树和右子树的左子树。
▶ 代码:
我们来看看代码:
public boolean isSymmetricChild(TreeNode leftTree,TreeNode rightTree) {//结构不一样的情况下if (leftTree != null && rightTree == null|| leftTree == null && rightTree != null) {return false;}//在结构一样的情况下左右子树都等于空if (leftTree == null && rightTree == null) {return true;}//在结构一样的情况下左右子树都不等于空//我们来判断左值和右值是否相等if (leftTree.val != rightTree.val) {return false;}//之后我们来遍历左子树的子树,右子树的右子树,再次判断是否结构相等和值是否相等return isSymmetricChild(leftTree.left,rightTree.right) &&isSymmetricChild(leftTree.right,rightTree.left);}public boolean isSymmetric(TreeNode root) {if (root == null) {return false;}return isSymmetricChild(root.left,root.right);}
❄️五、习题五(平衡二叉树):
☑ 题的链接:
平衡二叉树
▶ 思路:
如果我们想要判断是否是平衡二叉树呢,我们的左子树的高度和有字数的高度用需要 < 2,我们不只是需要判断 根结点的高度差是否 < 2,我们需要判断每一颗子树的高度差是否 < 2,如果大于 2 那么就不是平衡二叉树了。
这样理解之后呢,就是非常简单的了,我们需要使用我们上个博客写的求高度的方法,用来求高度,去求高度差,我们不只是需要判断根节点还需要判断根节点的左子树和根节点的右子树的高度差是否 < 2 。
▶ 代码:
我们来看看这道题的代码如何编写的:
public int getHeight(TreeNode root) {if (root == null) {return 0;}int leftHeight = getHeight(root.left);int rightHeight = getHeight(root.right);//谁高谁加一return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;}//平衡二叉树public boolean isBalanced(TreeNode root) {if (root == null) {return true;}int leftHeight = getHeight(root.left);int rightHeight = getHeight(root.right);//Math.abs是取绝对值return Math.abs(leftHeight - rightHeight) < 2 && isBalanced(root.left)&& isBalanced(root.right);}
❄️六、习题六(二叉树的构建和遍历):
☑ 题的链接:
二叉树的构建和遍历
▶ 思路:
我们呢这道题同样使用递归的思想来编写代码,这个呢是当我们在遇到 ‘#’ 的时候是为空的,我们按照前序遍历来把二叉树进行创建,第一个字符为根节点,之后我们就按照前序遍历的思想来进行编写代码,我们需要一个下标来遍历字符串,当遇到字符时候放入二叉树中,当为 ‘#’ 时呢,节点为空,就可以了。所以我们的思路就是:
1、先创建根节点
2、创建左子树
3、创建右子树
这个呢就是这道题的思路了,我们来看看这个代码是如何编写的:
▶ 代码:
import java.util.Scanner;
class TreeNode {public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val = val;}
}public class Main {public static int i = 0;public static TreeNode creatTree(String str) {TreeNode root = null;if (str.charAt(i) != '#') {root = new TreeNode(str.charAt(i));i++;root.left = creatTree(str);root.right = creatTree(str);} else {i++;}return root;}public static void inOrder(TreeNode root) {if (root == null) {return;}inOrder(root.left);System.out.print(root.val + " ");inOrder(root.right);}public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNextLine()) {String str = in.nextLine();TreeNode root = creatTree(str);inOrder(root);}}
}
OK,我们这道题到这里就结束了。
❄️七、总结:
OK,我们这次关于二叉树的习题的练习就到这里就结束了,我们在做这种二叉树的题的时候时刻都不要忘记递归的思想。我们呢下篇博客呢还是介绍关于我们二叉树的练习题了,让我们尽情期待吧!!!拜拜~~~
相关文章:

Java-数据结构-二叉树-习题(一) (✪ω✪)
文本目录: ❄️一、习题一(检查两颗树是否相同): ▶ 思路: ▶ 代码: ❄️二、习题二(另一棵树的子树): ▶ 思路: ▶ 代码: ❄️三、习题三(翻转二叉树): ▶ 思路: ▶ 代…...

js 时间戳转日期格式
timestampToDate(obj.project_time), import moment from “moment”; const timestampToDate (timestamp: any) > { const date new Date(timestamp * 1000); const newDate moment(date).format(“YYYY-MM-DD”); return newDate; // 使用Intl.DateTimeFormat进行格式…...

基于人工智能的自动驾驶系统项目教学指南
自动驾驶系统是人工智能的一个核心应用领域,涉及多个学科的交叉:从计算机视觉、深度学习、传感器融合到控制系统,自动驾驶项目可以提供高度的挑战性和实践意义。在这篇文章中,我们将构建一个基于深度学习的自动驾驶系统的简化版本…...

[Linux#49][UDP] 2w字详解 | socketaddr | 常用API | 实操:实现简易Udp传输
目录 套接字地址结构(sockaddr) 1.Socket API 2.sockaddr结构 3. sockaddr、sockaddr_in 和 sockaddr_un 的关系 sockaddr 结构体 sockaddr_in 结构体(IPv4 套接字地址) sockaddr_un 结构体(Unix域套接字地址&a…...

期权组合策略有什么风险?期权组合策略是什么?
今天期权懂带你了解期权组合策略有什么风险?期权组合策略是什么?期权组合策略是通过结合不同期权合约(如看涨期权和看跌期权),以及标的资产(如股票)来实现特定投资目标的策略。 期权组合策略市…...

从Zotero6到Zotero7的数据迁移尝试?(有错勿喷,多多指教!)
从Zotero6到Zotero7的数据迁移尝试 0 前言 之前在主机上一直用的Zotero6(实验室主机),最近发现在个人笔记本上看论文更频繁,尝试重新部署Zotero,才发现竟然更新了!所以这里简单记录一下数据迁移过程&…...

快速排序(分治思想)
什么是快速排序 快速排序(Quick Sort)是一种广泛使用的高效排序算法,由计算机科学家托尼霍尔在1960年提出。它采用分治法(Divide and Conquer)策略,将一个大数组分为两个小数组,然后递归地对这两…...

JAVA相关知识
JAVA基础知识 说一下对象创建的过程? 类加载检查:当Java虚拟机(JVM)遇到一个类的new指令时,它首先检查这个类是否已经被加载、链接和初始化。如果没有,JVM会通过类加载器(ClassLoaderÿ…...

详解TCP的三次握手
TCP(三次握手)是指在建立一个可靠的传输控制协议 (TCP) 连接时,客户端和服务器之间的三步交互过程。这个过程的主要目的是确保连接是可靠的、双方的发送与接收能力是正常的,并且可以开始数据传输。下面是对每个步骤的详细解释&…...

Java面试篇基础部分-Java创建线程详解
导语 多线程的方式能够在操作系统的多核配置上更好的利用服务器的多个CPU的资源,这样的操作可以使得程序运行起来更加高效。Java中多线程机制提供了在一个进程内并发去执行多个线程,并且每个线程都并行的去执行属于线程处理的自己的任务,这样可以提高程序的执行效率,让…...

Ubuntu 20.04/22.04无法连接网络(网络图标丢失、找不到网卡)的解决方案
问题复述: Ubuntu 20.04无法连接到网络,网络连接图标丢失,网络设置中无网络设置选项。 解决方案 对于Ubuntu 20.04而言:逐条执行 sudo service network-manager stopsudo rm /var/lib/NetworkManager/NetworkManager.statesudo…...

《MDTv2- Masked Diffusion Transformer is a Strong Image Synthesizer》
论文摘要 论文提出了一种名为**Masked Diffusion Transformer (MDT)**的新模型,旨在增强扩散概率模型(DPMs)在图像合成中的上下文推理能力。通过引入掩码潜在建模方案,MDT能够显著提升DPMs在图像中对象部分之间关系的学习能力&am…...

算法 - 二分查找
算法 - 二分查找 今天继续八股文学习,看一下比较常规的几个算法 二分查找是一个基于分治策略的搜索方法,简单的理解就是每次都缩小一轮搜索范围,从中间search一次,直到搜索到结果或者为空为止。 基本思路(设一个有序的…...

Python知识点:如何使用Python进行图像批处理
在Python中进行图像批处理可以使用多种库,如 Pillow、OpenCV 和 imageio。这些库可以用来执行各种图像处理任务,如调整大小、裁剪、旋转、滤镜应用等。以下是使用这些库进行图像批处理的示例。 使用 Pillow 进行图像批处理 Pillow 是一个功能强大的图像…...

数据结构实验1
实验题1:求1到n的连续整数和 题目描述 编写一个程序,对于给定的正整数n,求12…十n,采用逐个累加与(n1)/2(高斯法)两种解法。对于相同的n,给出这两种解法的求和结果和求解时间,并用相关数据进行测试。 运行代码 //实验题1:求1到n的连续整数和 #includ…...

使用Postman+JMeter进行简单的接口测试
以前每次学习接口测试都是百度,查看相关人员的实战经验,没有结合自己公司项目接口真正具体情况。 这里简单分享一下公司项目Web平台的一个查询接口,我会使用2种工具Postman和JMeter如何对同一个接口做调试。 准备工作 首先,登录公…...

基于 SpringBoot 的车辆充电桩管理系统
专业团队,咨询就送开题报告 摘 要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,车辆充电桩管理系统也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,…...

centos7.9安装clamav教程
本章教程主要记录在centos7.9安装clamav过程。 ClamAV(Clam AntiVirus)是一个开源的防病毒软件工具,主要用于检测和消除恶意软件。它最初由 Tomasz Kojm 于 2001 年开发,并由 Cisco Systems 维护和支持。ClamAV 广泛应用于邮件网关、文件服务器和其他需要防病毒保护的环境中…...

产品经理如何转型为AI产品经理,如何理解AI产品工程化
技术领域,特别是人工智能和机器学习,其优秀模型的成功应用是一个复杂过程,它不仅要求技术本身的卓越,还须与现有解决方案竞争,这涉及到技术成熟度、成本有效性、市场接受度等多维度因素。 在这一过程中,产品经理扮演着核心角色,负责协调各方利益,确保技术能够转化为满…...

TiDB从0到1学习笔记(精华篇)
历时四个月,恭喜赵老师的《TiDB从0到1》 系列文章顺利完结,小编再次梳理一遍文稿,并附注解分享给大家。 整体架构 从 TiDB 1.0 到 8.0,TiDB 的体系结构一直在不断演进。接下来让我们一起看看整体架构的变化。 TiDB v1 TiDB v1&…...

NLP-新词挖掘
一、背景 网络领域的新词发现(挖掘)是一个非常重要的nlp课题。在处理文本对象时,非常关键的问题在于“切词”这个环节,几乎所有的后续结果都依赖第一步的切词。因此切词的准确性在很大程度上影响着后续的处理,切词结果…...

电脑录屏不求人,9月必备免费录屏软件推荐!苹果电脑可用!
在当今这个信息爆炸的时代,电脑录屏软件已经成为了我们日常工作和生活中不可或缺的工具。无论是制作教学视频、录制在线课程、游戏直播,还是创建产品演示,一个好的录屏软件都能帮助我们更高效地完成任务。市场上的录屏软件琳琅满目࿰…...

SpringMVC基于注解使用:国际化
01-国际化介绍 首先在bootstrap下载个页面 下载后把登录页面的代码粘上去 然后再登录页面代码上有些超链接需要再spring-mvc.xml里面配置下,登录页面才能正常显示 配置静态资源 国际化-根据浏览器语言国际化 现在是中文的情况,要改为英文 1.配置下属…...

工地安全帽检测系统源码分享
工地安全帽检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…...

如何为 DigitalOcean 静态路由操作员设置故障转移
静态路由操作器的主要目的是提供更大的灵活性,并在 Kubernetes 环境中控制网络流量。它使你能够根据应用程序的需求自定义路由配置,从而优化网络性能。该操作器作为 DaemonSet 部署,因此将在你的 DigitalOcean Managed Kubernetes 集群的每个…...

Ansible简单部署与使用
目录 环境安装Ansibleapt installmarkupsafe error 配置Ansible创建个人目录ansible.cfghosts 测试Ansibleping批量执行自定义命令 环境 Ubuntu 20.04 安装Ansible apt install sudo apt install ansiblemarkupsafe error 安装成功后,尝试运行ansibleÿ…...

Harmony Next charles 抓包指南
1.选择安装移动证书 代理信息如下 2.设置手机代理 手机与电脑连接同一网络,然后配置步骤 1 的代理 路径:设置-wlan-选择当前网络编辑-代理-保存 注意:手机配置代理后,目前会默认断开连接,需要手动再连接下 wifi 3.鸿…...

【HarmonyOS】Beta最新对外版本IDE下载和环境配置
【HarmonyOS】Beta最新对外版本IDE下载和环境配置 前言 目前华为HarmonyOS的系统版本已经从Develop Beta升级为Beta预览版,全面开放。再也不需要白名单限制,才能下载使用最新的IDE和预览最新的开放文档了。 IDE下载和安装 Beta IDE下载地址 1.根据你…...

2024年9月第2周AI资讯
阅读时间:3-4min 更新时间:2024.9.9-2024.9.13 目录 Groq推出多模态大模型LLaVA v1.5 7B AI通过重读问题可以变得更聪明 美国Weave公司发布Isaac多功能个人机器人 特斯拉机器人出租车将实现无线充电 Adobe视频编辑新时代 无人驾驶汽车超越人类 AI…...

【软件使用-MEGA】构建进化树报错
*_summary.txt报错: MEGA-CC 10.2.6 Molecular Evolutionary Genetics Analysis Build#: 10210527-x86_640% Reading distance matrix MEGA-CC has logged the following error:When 2024年09月13日 下午 01时32分49秒 下午Data …...