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&…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
