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&…...
All in Token,移动,电信,联通,百度,阿里,字节,华为,Token战争,Token无用:李彦宏用DAA终结了AI的度量衡之争
今年4月,AI行业出现了一组让投资人坐立难安的数据:Anthropic年化营收突破300亿美元,正式超过OpenAI的约250亿美元。但反常的是,据第三方机构估算,Claude的月活用户仅约为ChatGPT的2.44%。以及,Anthropic的模…...
脉冲神经网络与神经形态计算的能效优化实践
1. 脉冲神经网络与神经形态计算基础脉冲神经网络(SNN)作为第三代神经网络模型,其核心在于模拟生物神经系统的信息处理机制。与传统人工神经网络(ANN)相比,SNN具有三个本质区别:首先,…...
Arm Iris调试接口:架构设计与工程实践详解
1. Iris调试与追踪接口深度解析调试与追踪技术是嵌入式系统开发的核心支柱,而Arm的Iris接口代表了这一领域的最新进展。作为一名长期从事嵌入式调试工具开发的工程师,我将带您深入剖析这套接口的设计哲学与实战应用。1.1 接口架构设计理念Iris的架构设计…...
Kubernetes原生自动化部署工具Keel:实现容器镜像自动更新的最后一公里
1. 项目概述:什么是Keel,以及它解决了什么问题如果你和我一样,在团队里负责过一段时间的应用部署和更新,那你一定对“发布日”的紧张感深有体会。开发那边代码一提交,这边就得开始手动拉取镜像、更新Kubernetes的Deplo…...
Midjourney像素艺术提示词工程:98%新手忽略的4个隐藏权重指令,实测提升风格还原度320%
更多请点击: https://intelliparadigm.com 第一章:Midjourney像素艺术提示词工程的底层逻辑重构 像素艺术在 Midjourney 中并非天然适配的生成模态,其高精度、低分辨率、强风格约束的特性与扩散模型默认的连续性渲染范式存在根本张力。要实现…...
别再只会Commit了!用Git Desktop搞定分支合并与冲突解决(附真实开发场景)
别再只会Commit了!用Git Desktop搞定分支合并与冲突解决(附真实开发场景) 当你第一次接触Git时,可能觉得它就是个"保存按钮"——每次改完代码就commit一下。但随着项目规模扩大,特别是多人协作时,…...
FinalBurn Neo:终极开源街机模拟器技术深度解析
FinalBurn Neo:终极开源街机模拟器技术深度解析 【免费下载链接】FBNeo FinalBurn Neo - We are Team FBNeo. 项目地址: https://gitcode.com/gh_mirrors/fb/FBNeo FinalBurn Neo(简称FBNeo)是一款专业级的开源街机模拟器,…...
树莓派5驱动128x128 LED矩阵:打造复古PICO-8游戏艺术墙
1. 项目概述与核心思路我一直对复古游戏和像素艺术情有独钟,也一直想在家里弄一个既有科技感又能玩的装饰品。最近,我把树莓派5、四块64x64的RGB LED矩阵面板和PICO-8幻想游戏机捣鼓到了一起,成功在墙上挂起了一个128x128像素的“游戏艺术墙”…...
量化交易性能优化:高性能内存管理与计算加速实践
1. 项目概述与核心价值最近在量化交易社区里,一个名为Lexus2016/turbo_quant_memory的项目引起了我的注意。乍一看这个标题,它融合了几个非常吸引人的关键词:“Turbo”(涡轮增压,意指加速)、“Quant”&…...
Harness 中的请求标识染色:端到端追踪
1. 标题选项(核心关键词:Harness、请求标识染色、端到端追踪、可观测性、CI/CD) 「Harness 可观测性实战:请求标识染色实现全链路端到端追踪」 「从0到1搞定Harness请求染色:让微服务调用链路+变更链路无所遁形」 「告别排查黑洞:Harness请求标识染色的端到端追踪落地指南…...
