当前位置: 首页 > 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;从最短…...

5个技巧让你网盘直链提取效率提升200%——网盘直链下载助手全攻略

5个技巧让你网盘直链提取效率提升200%——网盘直链下载助手全攻略 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 在当今数字化时代&#xff0c;网盘已成为我们存储和分享文件的重要工具&…...

AI驱动的下一代云ERP:SAP Cloud ERP 2602 更新亮点小结

大家好&#xff0c;SAP Cloud ERP 2602版本更新了&#xff01;2602的一个核心特点&#xff0c;是在保持标准化 SaaS 的前提下&#xff0c;将“嵌入式 AI 自然语言交互 Agentic AI”有机结合&#xff0c;让用户可以在熟悉的业务流程中&#xff0c;以对话方式完成信息查询、数据…...

Skija图像处理大全:编解码、滤镜与合成技术

Skija图像处理大全&#xff1a;编解码、滤镜与合成技术 【免费下载链接】skija Java bindings for Skia 项目地址: https://gitcode.com/gh_mirrors/sk/skija Skija作为Java绑定的Skia图形库&#xff0c;为开发者提供了强大的图像处理能力。本文将带您探索Skija在图像编…...

别再死记硬背UART帧格式了!用Arduino UNO和逻辑分析仪,5分钟带你‘看见’数据流

别再死记硬背UART帧格式了&#xff01;用Arduino UNO和逻辑分析仪&#xff0c;5分钟带你‘看见’数据流 记得第一次接触UART通信时&#xff0c;对着教科书上的帧格式图发呆了半小时——起始位、数据位、校验位、停止位&#xff0c;这些概念就像天书一样。直到有一天&#xff0c…...

Qwen3-VL:30B系统部署:U盘启动盘制作与安装

Qwen3-VL:30B系统部署&#xff1a;U盘启动盘制作与安装 1. 引言 在AI大模型快速发展的今天&#xff0c;本地化部署多模态模型成为许多开发者和企业的迫切需求。Qwen3-VL:30B作为强大的视觉语言模型&#xff0c;能够在离线环境下提供出色的多模态理解能力。但在开始模型部署之…...

计算机视觉——疲劳检测、基于DNN的年龄性别预测

一、疲劳检测&#xff08;基于 dlib 的人脸检测与 68 点关键点定位&#xff09;1.1摘要疲劳检测是一类通过分析人体行为&#xff08;如眼睛闭合、头部姿态、打哈欠等&#xff09;来判断个体是否处于疲劳或注意力不集中的技术。它在驾驶员监控、驾驶安全、课堂学员状态检测、远程…...

MacBook安装OpenClaw:M系列芯片运行Kimi-VL-A3B-Thinking优化指南

MacBook安装OpenClaw&#xff1a;M系列芯片运行Kimi-VL-A3B-Thinking优化指南 1. 为什么要在M系列MacBook上部署OpenClaw 去年我入手了M2 Max芯片的MacBook Pro&#xff0c;原本只是用来做日常开发&#xff0c;直到发现它能流畅运行多模态大模型。作为一个长期被Windows平台G…...

OpenClaw+Phi-3-vision-128k-instruct内容创作流:从图文素材到Markdown自动排版

OpenClawPhi-3-vision-128k-instruct内容创作流&#xff1a;从图文素材到Markdown自动排版 1. 为什么需要自动化内容创作流 作为一个长期与图文内容打交道的创作者&#xff0c;我每天都要处理大量零散的素材——截图、手写笔记、PPT片段、网页摘录。最痛苦的不是创作本身&…...

开源力量:OpenClaw+gemma-3-12b-it构建低成本个人AI助手

开源力量&#xff1a;OpenClawgemma-3-12b-it构建低成本个人AI助手 1. 为什么选择开源模型OpenClaw组合&#xff1f; 去年我尝试用商业API搭建个人自动化助手时&#xff0c;发现两个致命问题&#xff1a;一是每月Token费用超过预期3倍&#xff08;主要来自长链条任务的反复调…...

别再瞎调参了!HuggingFace Trainer微调BERT/ViT的保姆级避坑指南(附ArcFace实战代码)

HuggingFace Trainer微调实战&#xff1a;从参数陷阱到模型优化的深度拆解 当你第5次看到验证集准确率在0.85附近震荡不前&#xff0c;而训练损失仍在持续下降时&#xff0c;是否开始怀疑自己选择的优化器、学习率或损失函数&#xff1f;这不是个例——超过60%的NLP工程师在使用…...