Java-数据结构-二叉树习题(2)
第一题、平衡二叉树

① 暴力求解法
📚 思路提示:
该题要求我们判断给定的二叉树是否为"平衡二叉树"。
平衡二叉树指:该树所有节点的左右子树的高度相差不超过 1。
也就是说需要我们会求二叉树的高,并且要对节点内所有左右子树进行"高度差是否>1"的判断~
那么首先我们先回顾一下如何求一个二叉树的高:
首先,初始高度为0,然后仍然还是通过我们最常用的"将树不断分解成两个子树",通过不断地分解子树,达到树的最底层开始往回递归,每递归一次就使得高度++,最终返回两个子树的高的最大值,即可求得该树的高度。
该过程在之前模拟实现二叉树时就已经讲解过,所以这里就不再过多赘述了~
// 获取二叉树的高度public int TreeHeight(TreeNode root) {if(root == null){return 0;}int leftHeight = TreeHeight(root.left);int rightHeight = TreeHeight(root.right);return Math.max(leftHeight,rightHeight) + 1;}
那此时我们既然已经学会了求二叉树的高度,我们用最简单的思想解决该题:"求出每一个结点的左右树高度,并判断该树是否为平衡二叉树,若是则向上返回true,否不是则向上返回false"
需要注意的是:当我们将根节点传给 isBalanced() 函数时,我们得到的是" 根节点左右子树的高度差 ",通过根节点左右子树的高度差,我们就能够知道" 该根节点的树平衡 ",但是平衡二叉树的要求是" 所有结点都应是平衡树 ",所以仅仅判断传入结点是否平衡,是不够的,还要求它左右子树本身也要是平衡的(递归回来就会不断进行判断,只要中途出现了非平衡,就会递归回根节点)
⭐ 图示:
📚 首先调用 isBalanced 函数,对于根节点 3:

📕 先计算 TreeHeight(9) 和 TreeHeight(20) 并比较它们的差的绝对值是否小于等于 1 。
📕 然后我调用 isBalanced(9) 来检查以 9 为根节点的子树是否平衡(return true)
📕 然后调用 isBalanced(20) 来检查以 20 为根节点的子树是否平衡(return true)
(对于 isBalanced(20) 需要我们进一步调用 isBalanced(15) 和 isBalanced(7) 检查它们是否平衡,这里无论树有多长,都是一样的步骤,就不过多赘述了)
📖 代码示例:
class Solution {public boolean isBalanced(TreeNode root){if(root == null){return true;}int leftLen = TreeHeight(root.left);int rightLen = TreeHeight(root.right);return Math.abs(leftLen - rightLen) <= 1 && isBalanced(root.left) && isBalanced(root.right);}public int TreeHeight(TreeNode root) {if(root == null){return 0;}int leftHeight = TreeHeight(root.left) + 1;int rightHeight = TreeHeight(root.right) + 1;return Math.max(leftHeight,rightHeight);}
}
以上解题方法的时间复杂度为O(n^2),因为做了很多多余的计算(对一棵树进行多次求高)
② 自底向上递归法
📚 思路提示:
上述方法我们每判断一棵树,就都同时对它求了高度,但是因此就会出现很多重复遍历某个结点的情况,所以我们就想到了这个优化的方法:
自底向上的递归,求高度的同时,也对子树是否平衡进行判断,这样的方法时间复杂度为O(n)
具体的思路与第一种解法大同小异,只是该换了一种思路,将求高度与平衡判断放到了一起,这里就不过多赘述了,我们直接看代码~
📖 代码示例:
class Solution {public boolean isBalanced(TreeNode root) {return checkBalance(root)!= -1;}private int checkBalance(TreeNode root) {if (root == null) {return 0;}int leftHeight = checkBalance(root.left);if (leftHeight == -1) {return -1;}int rightHeight = checkBalance(root.right);if (rightHeight == -1) {return -1;}if (Math.abs(leftHeight - rightHeight) > 1) {return -1;}return Math.max(leftHeight, rightHeight) + 1;}
}
第二题、对称二叉树

📚 思路提示:
该题要求我们判断一个二叉树是否对称,一个树对称就需要有以下的要求:
📕 一个树对称,就要求它的左右子树都对称
📕 如果一个树对称,那么它的" 左侧子树的左子树 "等于" 对应右侧子树的右子树 "
同样的,它的" 左侧子树的右子树 "也等于" 对应右侧子树的左子树 "
⭐ 图示:

📖 代码示例:
class Solution {public boolean isSymmetric(TreeNode root) {return isSameTree(root.left,root.right);}public boolean isSameTree(TreeNode left,TreeNode right) {if(left == null && right == null){return true;}if(left == null || right == null || left.val != right.val){return false;}return isSameTree(left.left,right.right) && isSameTree(left.right,right.left);}
}
第三题、二叉树遍历

📚 思路提示:
该题要求我们按照它给出的字符串,通过前序遍历的顺序创建一个二叉树,并且再使用中序遍历打印出二叉树
相信大家现在对二叉树的遍历已经十分熟悉了,那么这题对大家来说就并没有难度~
我们只需要通过递归的方式来创建二叉树,再用递归的方式去遍历创建好的二叉树并打印各个结点
⭐ 图示:

📖 代码示例:
import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
class TreeNode{public char val;public TreeNode left;public TreeNode right;public TreeNode(char val){this.val = val;}
}
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String s = in.next();TreeNode root = createTree(s);display(root);}public static int i = 0;public static TreeNode createTree(String s){char a = s.charAt(i++);if(a == '#'){return null;}TreeNode root = new TreeNode(a);root.left = createTree(s);root.right = createTree(s);return root;}public static void display(TreeNode root){if(root == null){return;}display(root.left);System.out.print(root.val + " ");display(root.right);}
}
第四题、二叉树的层序遍历

📚 思路提示:
该题要求我们通过题中给定的二叉树根节点,对二叉树进行层序遍历
想要实现二叉树的层序遍历,我们就要创建一个"辅助队列":
📕 用于存储该层的结点值到List中
📕 用于存储下一层的结点
我们需要做的就是创建一个while()循环,当队列不为空时,循环就继续进行,而在循环内:
📕 首先,将队列中原有结点(即上一层的结点)的值存入临时的ArrayList中
📕 然后,通过队列中原有结点,找出下一层的结点,将非空结点存入队列,便于下次访问
📕 最后,在这次循环的末尾,将临时的ArrayList存入List中
⭐ 图示:

📖 代码示例:
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> list = new ArrayList<List<Integer>>();Deque<TreeNode> deque = new ArrayDeque<>();if (root == null) {return list;}deque.push(root);while (!deque.isEmpty()) {List<Integer> liSt = new ArrayList<>();int len = deque.size();for (int i = 0; i < len; i++) {TreeNode node = deque.removeLast();if (node != null) {liSt.add(node.val);if(node.left != null){deque.push(node.left);}if(node.right != null){deque.push(node.right);}}}list.add(liSt);}return list;}
}
第五题、二叉树的层序遍历 II

📚 思路提示:
这题和上一题其实都可以归结于一道题,它们的区别就是将数据的存储从第一层到最后一层,改成了从最后一层到第一层。
其实想要实现这个并不需要我们逆序遍历或者逆序存储之类的,我们只需要稍微改换一下每一次临时ArrayList的存储位置即可:

⭐ 图示:

📖 代码示例:
class Solution {public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List<Integer>> list = new ArrayList<List<Integer>>();Deque<TreeNode> deque = new ArrayDeque<>();if (root == null) {return list;}deque.push(root);while (!deque.isEmpty()) {List<Integer> liSt = new ArrayList<>();int len = deque.size();for (int i = 0; i < len; i++) {TreeNode node = deque.removeLast();if (node != null) {liSt.add(node.val);if(node.left != null){deque.push(node.left);}if(node.right != null){deque.push(node.right);}}}list.add(0,liSt);}return list;}
}
第六题、二叉树的最近公共祖先

📚 思路提示:
想要求出一棵树中两个节点的最近公共祖先,就要先知道什么是公共祖先:

还是一样的,通过递归的方法,不断地向下探索,直到找到p或者q的时候,就开始向上递归,当然遇到null的时候也要开始向上递归~而我们需要搜索的值有两个,但只要遇到其中之一我们就要递归,所以在查找公共祖先的过程中,我们需要关注以下几点:
📕 如果在递归的过程中,root的左右子结点一个为空一个不为空,则代表不为空的一边找到了目标值,返回不为空的那一边的结点
(有可能是此时另一个要找的结点在根节点的右子树中)
(有可能是此时另一个要找的结点在已找到的结点的子树中)
(包含了这两种情况,并且都能妥善的解决)
📕 如果root的左右子节点均不为空,则代表此时已经找到了两个节点的最近公共祖先,直接返回root即可
📕 以上方法已经包含了(左右子节点均为空)的解决方法,若中途出现该情况,则最后的root返回值会是null
⭐ 图示:

📖 代码示例:
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null || root == p || root == q){return root;}TreeNode left = lowestCommonAncestor(root.left,p,q);TreeNode right = lowestCommonAncestor(root.right,p,q);if(right == null){return left;}if(left == null){return right;}if(left != null && right != null){return root;}return root;}
}
那么这次关于二叉树的习题相关知识,就为大家分享到这里啦,作者能力有限,如果有讲得不清晰或者不正确的地方,还请大家在评论区多多指出,我也会虚心学习的!那我们下次再见哦
相关文章:
Java-数据结构-二叉树习题(2)
第一题、平衡二叉树 ① 暴力求解法 📚 思路提示: 该题要求我们判断给定的二叉树是否为"平衡二叉树"。 平衡二叉树指:该树所有节点的左右子树的高度相差不超过 1。 也就是说需要我们会求二叉树的高,并且要对节点内所…...
解锁面向对象编程:Python 类与对象详解
🏠大家好,我是Yui_💬 🍑如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 🚀如有不懂,可以随时向我提问,我会全力讲解~ ὒ…...
国产编辑器EverEdit -重复行
1 重复行 1.1 应用场景 在代码或文本编辑过程中, 经常需要快速复制当前行,比如,给对象的多个属性进行赋值。传统的做法是:选中行-> 复制-> 插入新行-> 粘贴,该操作有4个步骤,非常繁琐。 那有没…...
记一次数据库连接 bug
整个的报错如下: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Metho…...
【Springboot相关知识】Springboot结合SpringSecurity实现身份认证以及接口鉴权
Springboot结合SpringSecurity实现身份认证以及接口鉴权 身份认证1. 添加依赖2. 配置JWT工具类3. 配置Spring Security4. 创建JWT请求过滤器5. 创建认证控制器6. 创建请求和响应对象7. 配置UserDetailsService8. 运行应用程序9. 测试总结 接口鉴权1. 启用方法级安全注解2. 定义…...
算法竞赛之差分进阶——等差数列差分 python
目录 前置知识进入正题实战演练 前置知识 给定区间 [ l, r ],让我们把数组中的[ l, r ] 区间中的每一个数加上c,即 a[ l ] c , a[ l 1 ] c , a[ l 2] c , a[ r ] c; 怎么做?很简单,差分一下即可 还不会的小伙伴点此进入学习 进入正题 …...
20250121在Ubuntu20.04.6下使用Linux_Upgrade_Tool工具给荣品的PRO-RK3566开发板刷机
sudo upgrade_tool uf update.img 20250121在Ubuntu20.04.6下使用Linux_Upgrade_Tool工具给荣品的PRO-RK3566开发板刷机 2025/1/21 11:54 百度:ubuntu RK3566 刷机 firefly rk3566 ubuntu upgrade_tool烧写详解 https://wiki.t-firefly.com/Core-3566JD4/03-upgrad…...
【Elasticsearch】Springboot编写Elasticsearch的RestAPI
RestAPI 初始化RestClient创建索引库Mapping映射 判断索引库是否存在删除索引库总结 ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。 官方文档地址 由于ES目前最新版本是8.8,提供了全…...
Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具
我先说说文章标题中的“够用版”啥意思,为什么这么写。 按照我个人观点,在使用Python进行数据分析时,我们有时候肯定要结合到图表去进行分析,去直观展现数据的规律和特定,那么我们肯定要做一些简单的可视化࿰…...
1.21学习
misc buuctf-爱因斯坦 下载附件后是一个图片,用stegsolve查看一下,各个色都没有问题,然后看一下数据分析,除此之外无其他信息,再看看图片属性,不知道是啥,用随波逐流进行binwalk文件提取然后得…...
SoftGNSS软件接收机源码阅读(一)程序简介、运行调试、执行流程
原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、softGNSS 简介1、概述2、相关工作3、我用 softGNSS 做的事4、文件结构5、程序执行流程图 二、程序使用1、射频前端2、参数设置3、处理开源数据…...
Spring Boot AOP实现动态数据脱敏
依赖&配置 <!-- Spring Boot AOP起步依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>/*** Author: 说淑人* Date: 2025/1/18 23:03* Desc…...
Leetcode刷题-二分查找
灵神的二分视频:二分查找 红蓝染色法_哔哩哔哩_bilibili 34 class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:right len(nums) - 1left 0res [-1,-1]mid int((right left)/2)while right > left:if nums[mid] < …...
凭证Account Assignment的校验(FAGL_VALIDATE)
本文主要介绍在S4 HANA OP中凭证Account Assignment的校验配置。具体请参照如下内容: 目录 1. 定义Account Assignment校验策略(FAGL_VALIDATE) 1.1 Derivation Rule 1.2 Assignment 1.3 Initialize 1.4 Enhancement 2. 分配Account Assignment校验策略给公司…...
【20】Word:小许-质量管理-论文❗
目录 题目 NO1.2.3.4.5 NO6.7 NO8 NO9 NO10.11 题目 NO1.2.3.4.5 另存为“Word.docx”文件在考生文件夹下,F12Fn是另存为的作用布局→页面设置对话框→纸张:大小A4→页边距:上下左右不连续ctrl选择除表格外的所有内容→开始→字体对…...
二十八、Qos服务质量
Qos服务质量 一、产生原因 Resources也不是万能的,使用一段时间后,资源总量可能会超过接节点配置。 根据这个情况,我们可以设置,清除资源。给pod配置,按顺序删除 二、服务质量QoS分类 Guaranteed:最高服务质量(保证),当宿主机内存不够时,会先kill掉QoS为BestEffort…...
Flutter 改完安卓 applicationId 后App 闪退问题。
一、问题 当我们项目创建完,想 build.gradle 改 applicationId 的时候,再次执行的时候可能会出现 app 闪退问题, 控制台不显示任何错误提示 也不出现 Exit 停止运行的情况。(像下方这样, 而 app 只是在模拟器中一闪而…...
es 3期 第25节-运用Rollup减少数据存储
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性ÿ…...
小菜鸟系统学习Python第三天
1.优先级问题: 结论: 幂运算>正负号>加减乘除和整除>比较运算符>逻辑运算符 2.三元运算符 3.assert断言:抛出AssertionError异常 4.for循环 4. 5.break和continue...
七.网络模型
最小(支撑)树问题 最小部分树求解: 破圈法:任取一圈,去掉圈中最长边,直到无圈; 加边法:取图G的n个孤立点{v1,v2,…, vn }作为一个支撑图,从最短…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
计算机系统结构复习-名词解释2
1.定向:在某条指令产生计算结果之前,其他指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方,那么就可以避免停顿。 2.多级存储层次:由若干个采用不同实现技术的存储…...
