当前位置: 首页 > news >正文

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)

第一题、平衡二叉树 ① 暴力求解法 &#x1f4da; 思路提示&#xff1a; 该题要求我们判断给定的二叉树是否为"平衡二叉树"。 平衡二叉树指&#xff1a;该树所有节点的左右子树的高度相差不超过 1。 也就是说需要我们会求二叉树的高&#xff0c;并且要对节点内所…...

解锁面向对象编程:Python 类与对象详解

&#x1f3e0;大家好&#xff0c;我是Yui_&#x1f4ac; &#x1f351;如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f680;如有不懂&#xff0c;可以随时向我提问&#xff0c;我会全力讲解~ &#x1f52…...

国产编辑器EverEdit -重复行

1 重复行 1.1 应用场景 在代码或文本编辑过程中&#xff0c; 经常需要快速复制当前行&#xff0c;比如&#xff0c;给对象的多个属性进行赋值。传统的做法是&#xff1a;选中行-> 复制-> 插入新行-> 粘贴&#xff0c;该操作有4个步骤&#xff0c;非常繁琐。 那有没…...

记一次数据库连接 bug

整个的报错如下&#xff1a; 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 ]&#xff0c;让我们把数组中的[ l, r ] 区间中的每一个数加上c,即 a[ l ] c , a[ l 1 ] c , a[ l 2] c , a[ r ] c; 怎么做&#xff1f;很简单&#xff0c;差分一下即可 还不会的小伙伴点此进入学习 进入正题 …...

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 百度&#xff1a;ubuntu RK3566 刷机 firefly rk3566 ubuntu upgrade_tool烧写详解 https://wiki.t-firefly.com/Core-3566JD4/03-upgrad…...

【Elasticsearch】Springboot编写Elasticsearch的RestAPI

RestAPI 初始化RestClient创建索引库Mapping映射 判断索引库是否存在删除索引库总结 ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。 官方文档地址 由于ES目前最新版本是8.8&#xff0c;提供了全…...

Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具

我先说说文章标题中的“够用版”啥意思&#xff0c;为什么这么写。 按照我个人观点&#xff0c;在使用Python进行数据分析时&#xff0c;我们有时候肯定要结合到图表去进行分析&#xff0c;去直观展现数据的规律和特定&#xff0c;那么我们肯定要做一些简单的可视化&#xff0…...

1.21学习

misc buuctf-爱因斯坦 下载附件后是一个图片&#xff0c;用stegsolve查看一下&#xff0c;各个色都没有问题&#xff0c;然后看一下数据分析&#xff0c;除此之外无其他信息&#xff0c;再看看图片属性&#xff0c;不知道是啥&#xff0c;用随波逐流进行binwalk文件提取然后得…...

SoftGNSS软件接收机源码阅读(一)程序简介、运行调试、执行流程

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;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刷题-二分查找

灵神的二分视频&#xff1a;二分查找 红蓝染色法_哔哩哔哩_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的校验配置。具体请参照如下内容&#xff1a; 目录 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”文件在考生文件夹下&#xff0c;F12Fn是另存为的作用布局→页面设置对话框→纸张&#xff1a;大小A4→页边距&#xff1a;上下左右不连续ctrl选择除表格外的所有内容→开始→字体对…...

二十八、Qos服务质量

Qos服务质量 一、产生原因 Resources也不是万能的,使用一段时间后,资源总量可能会超过接节点配置。 根据这个情况,我们可以设置,清除资源。给pod配置,按顺序删除 二、服务质量QoS分类 Guaranteed:最高服务质量(保证),当宿主机内存不够时,会先kill掉QoS为BestEffort…...

Flutter 改完安卓 applicationId 后App 闪退问题。

一、问题 当我们项目创建完&#xff0c;想 build.gradle 改 applicationId 的时候&#xff0c;再次执行的时候可能会出现 app 闪退问题&#xff0c; 控制台不显示任何错误提示 也不出现 Exit 停止运行的情况。&#xff08;像下方这样&#xff0c; 而 app 只是在模拟器中一闪而…...

es 3期 第25节-运用Rollup减少数据存储

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…...

小菜鸟系统学习Python第三天

1.优先级问题: 结论: 幂运算>正负号>加减乘除和整除>比较运算符>逻辑运算符 2.三元运算符 3.assert断言:抛出AssertionError异常 4.for循环 4. 5.break和continue...

七.网络模型

最小(支撑)树问题 最小部分树求解&#xff1a; 破圈法&#xff1a;任取一圈&#xff0c;去掉圈中最长边&#xff0c;直到无圈&#xff1b; 加边法&#xff1a;取图G的n个孤立点&#xff5b;v1&#xff0c;v2&#xff0c;…&#xff0c; vn }作为一个支撑图&#xff0c;从最短…...

AX-MES生产制造管理系统-总览

前言说起 MES 就不得不说 ERP&#xff0c;但是 ERP 大家基本上都知道&#xff0c;MES 就不一定了&#xff0c;常见的 ERP 系统包括 SAP、金蝶、用友等&#xff0c;ERP的流程相对来说也比较统一&#xff1b;MES就不同了&#xff0c;基本上熟悉业务流程的软件公司都可以开发并实施…...

Unity UGUI轻量UI框架:200行代码实现零GC界面管理

1. 为什么还要自己手写UI框架&#xff1f;——当UGUI原生方案开始“卡脖子”很多人看到这个标题第一反应是&#xff1a;“都2024年了&#xff0c;还手写UI框架&#xff1f;Asset Store里几十个成熟方案&#xff0c;NGUI、FairyGUI、TextMeshPro配套的UI系统一抓一大把&#xff…...

基于Arduino的模块化DIY智能时钟:从RTC到RGB LED的完整实现

1. 项目概述&#xff1a;打造一台高度可定制的DIY RGB LED时钟如果你和我一样&#xff0c;对市面上千篇一律的电子钟感到审美疲劳&#xff0c;同时又对Arduino和电子DIY充满热情&#xff0c;那么这个项目可能就是为你准备的。我们不是在简单地组装一个套件&#xff0c;而是在亲…...

Onekey终极指南:如何5分钟快速获取Steam游戏清单的免费神器

Onekey终极指南&#xff1a;如何5分钟快速获取Steam游戏清单的免费神器 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 还在为复杂的Steam游戏清单下载而头疼吗&#xff1f;想要备份游戏资源却不…...

Veo 2胶片质感生成器失效?——深度解析Color Science v2.3内核中被屏蔽的Cinematic Grain Injection层

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Veo 2胶片质感生成器失效现象全景透视 近期大量用户反馈&#xff0c;Veo 2 胶片质感生成器在调用 generate_film_effect() 接口后返回空纹理、纯灰帧或 HTTP 503 Service Unavailable 错误&#xff0c;且该问题…...

别再只测accuracy!DeepSeek集成测试必须监控的5个隐性指标(P99首token延迟、context bleed率、tool-call schema漂移)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek集成测试的核心范式演进 DeepSeek大模型的工程化落地对集成测试提出了全新挑战&#xff1a;传统基于接口响应码与字段校验的测试范式已难以覆盖语义一致性、推理链鲁棒性、上下文敏感度等高阶质…...

光轮智能 谢晨 访谈总结机器人仿真数据产业

光轮智能 谢晨 访谈总结机器人仿真关于创始人关于数据数据金字塔数据痛点仿真数据的重要性仿真数据的质量b站链接地址公司官网关于创始人 清华物理&#xff1b;哥伦比亚金融&#xff1b;英伟达智驾仿真&#xff1b;小鹏智驾仿真&#xff1b;现为光轮智能CEO 关于数据 数据的…...

Unity渲染排序三要素:SortingLayer、Order in Layer与RenderQueue协同原理

1. 为什么刚进Unity的美术和程序总在“图层遮挡”上反复拉扯&#xff1f;“这个UI怎么被背景挡住了&#xff1f;”“粒子特效一开就穿模&#xff0c;明明Z轴没问题&#xff01;”“我调了Order in Layer到999&#xff0c;还是被另一个Sprite挡住——它连Sorting Layer都没改过&…...

2026 文章代码高亮方案选型

将基于 Prism.js 或 Highlight.js 的传统高亮方案与基于 Shiki 的现代化高亮方案进行对比&#xff0c;其核心区别在于底层解析原理的不同&#xff08;正则表达式 vs. TextMate 语法树&#xff09;。 以下是两种方案的底层原理、各自优缺点、核心对比矩阵以及适用场景的详细分析…...

phpMyAdmin CVE-2018-12613:从文件读取到RCE的伪协议利用链

1. 这个漏洞不是“能读文件”那么简单&#xff0c;而是后台权限的彻底失守phpMyAdmin 4.8.1里那个CVE-2018-12613&#xff0c;很多人扫到就报个“存在文件包含”&#xff0c;顺手贴个?targetphp://filter/convert.base64-encode/resource/etc/passwd截图完事。我去年在给一家教…...