二叉树精选面试题
💎 欢迎大家互三:2的n次方_
1. 相同的树
100. 相同的树
同时遍历两棵树
判断结构相同:也就是在遍历的过程中,如果有一个节点为null,另一棵树的节点不为null,那么结构就不相同
判断值相同:只需要在遍历的过程中判断当前节点的val值是否相同
class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {//判断结构if ((p == null && q != null) || (p != null && q == null))return false;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);}
}
2. 另一棵树的子树
572. 另一棵树的子树
这里给出的子树定义是需要包括某个节点和这个节点所有后代节点,少一个都不行
下面这两种就可以看作是子树
思路:
1.判断当前子树是否和根节点一样
2.判断子树是否和当前root的左子树一样
3.判断子树是否和当前root的右子树一样
判断两棵树是否一样在上一题已经写好了,可以直接拿来用
class Solution {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 boolean isSameTree(TreeNode p, TreeNode q) {if ((p == null && q != null) || (p != null && q == null))return false;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);}
}
3. 翻转二叉树
226. 翻转二叉树
这道题只需要在遍历的同时把当前节点的左子树和右子树进行交换即可
class Solution {public TreeNode invertTree(TreeNode root) {if (root == null)return null;if (root.right == null && root.left == null)return root;TreeNode tmp = root.left;root.left = root.right;root.right = tmp;invertTree(root.left);invertTree(root.right);return root;}
}
4. 对称二叉树
101. 对称二叉树
思路:对称二叉树其实就是左子树的左子树和右子树的右子树,左子树的右子树和右子树的左子树的值相同,和之前判断相同的树类似,先比较结构,如果结构不一样肯定不是对称的,接着再判断值,通过递归实现左子树和右子树的判断
public boolean isSymmetric(TreeNode root) {if (root == null)return true;return isSymmetricChild(root.left, root.right);}public boolean isSymmetricChild(TreeNode root1, TreeNode root2) {//判断结构相同if (root1 != null && root2 == null || root1 == null && root2 != null) {return false;}if (root1 == null && root2 == null) {return true;}//判断值相同if(root1.val != root2.val){return false;}//左子树的左子树和右子树的右子树,左子树的右子树和右子树的左子树return isSymmetricChild(root1.left,root2.right) && isSymmetricChild(root1.right,root2.left);}
5. 平衡二叉树
110. 平衡二叉树
平衡二叉树是指任意节点的两个子树的高度差不超过1的二叉树
思路:遍历这棵树的每一个节点,求每一个节点的左子树和右子树,判断高度是否相差大于1,并且左子树和右子树也要是平衡二叉树
class Solution {public boolean isBalanced(TreeNode root) {if(root == null) return true;int res = getHeight(root.left) - getHeight(root.right);if(res <= -2 || res >= 2){return false;}return isBalanced(root.left)&&isBalanced(root.right);}//求树的高度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;}
}
这种方法简单直观,但是时间复杂度是O(n²)的,因为每次判断一个节点时,都要判断一次子树,重复计算,性能不高,接下来优化一下
class Solution {public boolean isBalanced(TreeNode root) {if(root == null) return true;//如果返回-1表示不是平衡二叉树return getHeight(root) >= 0;}public int getHeight(TreeNode root) {if (root == null)return 0;int leftHeight = getHeight(root.left);//如果拿到的还是-1,表示已经不是平衡二叉树,返回-1if(leftHeight < 0){return -1;}int rightHeight = getHeight(root.right);if(rightHeight >= 0 && Math.abs(leftHeight - rightHeight) <= 1){return Math.max(leftHeight,rightHeight) + 1;}else{return -1;}}
}
上面优化的是如果已经判断出不是平衡二叉树,就返回-1,不用再进行其他判断了
6. KY11 二叉树遍历
KY11 二叉树遍历
例如,根据题目中输入的字符串可以构建出这样一棵二叉树
那么怎么去实现呢
首先就是遍历字符串,遇到 "#" 就跳过,不是的话就创建相应的节点,并通过递归的形式,进行左右子节点的连接
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) {Main main = new Main();Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseString str = in.nextLine();TreeNode root = main.createTree(str);main.inOrder(root);}}public int i = 0;//在递归的过程中连接节点public TreeNode createTree(String str) {TreeNode root = null;if (str.charAt(i) != '#') {root = new TreeNode(str.charAt(i));i++;root.left = createTree(str);root.right = createTree(str);} else {i++;}return root;}//遍历打印public void inOrder(TreeNode root) {if (root == null) return;inOrder(root.left);System.out.print(root.val + " ");inOrder(root.right);}
}
7. 二叉树的最近公共祖先
236. 二叉树的最近公共祖先
可以分为下面几种情况 :
如果刚开始就是root是p或者q,直接返回root,不是的话就去左右子树里边找,首先就是p,q在两边的情况,那么就是左右子树的返回值都不为空,根节点root就是最近公共祖先,然后就是p,q在同一边的情况,这个又可以分为两种情况,首先就是p,q不在同一深度,此时就又回到了刚开始的情况,新的根节点就是最近公共祖先,然后就是p,q在通一深度的情况,此时,新的root还是最近公共祖先
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null)return null;if (root == p || root == q) {return root;}TreeNode leftNode = lowestCommonAncestor(root.left, p, q);TreeNode rightNode = lowestCommonAncestor(root.right, p, q);if(rightNode != null && leftNode != null){return root;}else if(leftNode!=null){return leftNode;}else{return rightNode;}}
}
除了这种方法,还有另外一种思路,可以看作链表的交叉来做
相关文章:
二叉树精选面试题
💎 欢迎大家互三:2的n次方_ 1. 相同的树 100. 相同的树 同时遍历两棵树 判断结构相同:也就是在遍历的过程中,如果有一个节点为null,另一棵树的节点不为null,那么结构就不相同 判断值相同:只需…...
如何在 Android 中删除和恢复照片
对于智能手机用户来说,相机几乎已经成为一种条件反射:你看到值得注意的东西,就拍下来,然后永远保留这段记忆。但如果那张照片不值得永远保留怎么办?众所周知,纸质快照拿在手里很难舍弃,而 Andro…...
HarmonyOS Next原生应用开发-从TS到ArkTS的适配规则(六)
一、仅支持一个静态块 规则:arkts-no-multiple-static-blocks 级别:错误 ArkTS不允许类中有多个静态块,如果存在多个静态块语句,请合并到一个静态块中。 TypeScript class C {static s: stringstatic {C.s aa}static {C.s C.s …...
功能测试与APPSCAN自动化测试结合的提高效率测试策略
背景 手工探索性测试(Manual Exploratory Testing,简称MET)是一种软件测试方法,它依赖于测试人员的直觉、经验和即兴发挥来探索应用程序或系统。与传统的脚本化测试相比,手工探索性测试不遵循固定的测试脚本࿰…...
AVL树的理解和实现[C++]
文章目录 AVL树AVL树的规则或原理 AVL树的实现1.节点的定义2.功能和接口等的实现默认构造函数,析构函数拷贝构造函数插入搜索打印函数检查是否为平衡树,检查平衡因子旋转 AVL树 AVL树,全称Adelson-Velsky和Landis树,是一种自平衡…...
云计算遭遇的主要安全威胁
以下是详细说明云计算遭遇的所有主要安全威胁: 1. 数据泄露 描述:数据泄露是指未经授权的情况下访问和获取敏感数据。云计算环境中的数据泄露通常由于不安全的配置、软件漏洞或内部威胁造成。 案例: Capital One数据泄露:2019…...
[MySQL]02 存储引擎与索引,锁机制,SQL优化
Mysql存储引擎 可插拔式存储引擎 索引是在存储引擎底层上实现的 inno DB MySQL默认存储引擎: inno DB高可靠性和高性能的存储引擎 DML操作遵循ACID模型支持事务行级锁,提高并发访问性能支持外键 约束,保证数据完整性和可靠性 MySAM MySAM是MySQL的早期引擎 特点: 不支持事…...
ld,GNU 链接器介绍以及命令行参数详解
ld,GNU 链接器介绍以及命令行参数详解 当我们使用GCC编译源代码生成可执行程序,经过预处理、汇编、编译、链接四个阶段。 链接器(Linker)将多个目标文件和库文件链接起来,链接器还解决目标文件之间的符号引用ÿ…...
[web]-反序列化-base64
看到源码 <?php error_reporting(0); class A {public $contents "hello ctfer";function __toString(){if ((preg_match(/^[a-z]/i,$this->contents))) {system("echo $this->contents");return 111;}else{return "...";}} }functi…...
【医学影像】RK3588+FPGA:满足远程诊疗系统8K音视频编解码及高效传输需求
医学影像 提供基于Intel平台、NXP平台、Rockchip平台的核心板、Mini-ITX主板、PICO-ITX主板以及工业整机等计算机硬件。产品板载内存,集成超高清编码/解码视频引擎,具有出色的数据处理能力和图形处理能力,功能高集成,可应用于超声…...
昇思25天学习打卡营第16天|基于MindSpore通过GPT实现情感分类
文章目录 昇思MindSpore应用实践1、基于MindSpore通过GPT实现情感分类GPT 模型(Generative Pre-Training)简介imdb影评数据集情感分类 2、Tokenizer导入预训练好的GPT3、基于预训练的GPT微调实现情感分类 Reference 昇思MindSpore应用实践 本系列文章主…...
服务器借助笔记本热点WIFI上网
一、同一局域网环境 1、当前环境,已有交换机组网环境,服务器已配置IP信息。 设备ip服务器125.10.100.12交换机125.10.100.0/24笔记本125.10.100.39 2、拓扑图 #mermaid-svg-D4moqMym9i0eeRBm {font-family:"trebuchet ms",verdana,arial,sa…...
开发实战中Git的常用操作
Git基础操作 1.初始化仓库 git init解释:在当前目录中初始化一个新的Git仓库。 2.克隆远程仓库 git clone <repository-url>解释:从远程仓库克隆一个完整的Git仓库到本地。 3.检查当前状态 git status解释:查看当前工作目录的状态…...
python调用chrome浏览器自动化如何选择元素
功能描述:在对话框输入文字,并发送。 注意: # 定位到多行文本输入框并输入内容。在selenium 4版本中,元素定位需要填写父元素和子元素名。 textarea driver.find_element(By.CSS_SELECTOR,textarea.el-textarea__inner) from …...
深入理解JS中的排序
在JavaScript开发中,排序是一项基础而重要的操作。本文将探讨JavaScript中几种常见的排序算法,包括它们的原理、实现方式以及适用场景。 1、冒泡排序 1.1、原理 通过比较相邻两个数的大小,交换位置排序:如果后一个数比前一个数小,则交换两个数的位置,重复这个过程,直…...
Kafka之存储设计
文章目录 1. 分区和副本的存储结构1. 分区和副本的分布2. 存储目录结构3. 文件描述 2. 相关配置3. 数据文件类型4. 数据定位原理LogSegment 类UnifiedLog 类 5. 副本数据同步HW水位线LEO末端偏移量HW更新原理 6. 数据清除 1. 分区和副本的存储结构 在一个多 broker 的 Kafka 集…...
Python面试整理-Python中的函数定义和调用
在Python中,函数是一种封装代码的方式,使得代码模块化和复用性更强。定义和调用函数是Python编程中的基本技能。以下是关于如何在Python中定义和调用函数的详细介绍: 函数定义 函数在Python中使用def关键字进行定义。函数体开始前,通常有一个可选的文档字符串(docstring)…...
HTTP协议、Wireshark抓包工具、json解析、天气爬虫
HTTP超文本传输协议 HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP 协议的重要特点: 一发一收…...
electron项目中实现视频下载保存到本地
第一种方式:用户自定义选择下载地址位置 渲染进程 // 渲染进程// 引入 import { ipcRenderer } from "electron";// 列表行数据下载视频操作,diffVideoUrl 是视频请求地址 handleDownloadClick(row) {if (!row.diffVideoUrl) {this.$message…...
基于chrome插件的企业应用
一、chrome插件技术介绍 1、chrome插件组件介绍 名称 职责 访问权限 DOM访问情况 popup 弹窗页面。即打开形式是通过点击在浏览器右上方的icon,一个弹窗的形式。 注: 展示维度 browser_action:所有页面 page_action:指定页面 可访问绝大部分api 不可以 bac…...
unittest框架和pytest框架区别及示例
unittest框架和pytest框架区别及示例 类型unittest框架pytest框架unittest框架示例pytest框架示例安装python内置的一个单元测试框架,标准库,不需要安装第三方单元测试库,需要安装使用时直接引用 import unittest安装命令:pip3 install pyte…...
IDEA性能优化方法解决卡顿
文章目录 前言一、可以采取以下措施:二、VM Options的参数解释1. 内存设置2. 性能调优3. GC(垃圾回收)调优4. 调试和诊断5. 其它设置6.设置 VM Options 的步骤: 总结 前言 我们在使用 IntelliJ IDEA的时候有时候会觉得卡顿&#x…...
Mysql集合转多行
mysql 集合转多行 SELECT substring_index(substring_index(t1.group_ids, ,, n), ,, -1) AS group_id FROM (select 908,909 as group_ids ) t1, (SELECT rownum : rownum 1 AS n FROM ( SELECT rownum : 0 ) r, orders ) t2 WHERE n < ( LENGTH( t1.group_ids ) - LENGT…...
MFC:只允许产生一个应用程序实例的具体实现
在MFC(Microsoft Foundation Class)应用程序中,如果你想限制只允许产生一个应用程序实例,通常会使用互斥体(Mutex)来实现。这可以确保如果用户尝试启动第二个实例时,它会被阻止或将焦点返回到已…...
深入理解TCP/IP协议中的三次握手
👍 个人网站:【洛秋资源小站】 深入理解TCP/IP协议中的三次握手 在计算机网络中,TCP/IP协议是通信的基石。理解TCP/IP协议中的三次握手是掌握网络通信的关键步骤之一。本文将详细解释TCP/IP协议中的三次握手过程,探讨其工作原理&…...
【React】事件绑定、React组件、useState、基础样式
React 教程 目录 事件绑定 1.1. 基础实现 1.2. 使用事件参数 1.3. 传递自定义参数 1.4. 同时传递事件对象和自定义参数 React 组件 2.1. 组件是什么 2.2. 组件基础使用 useState:状态管理 3.1. 基础使用 3.2. 状态的修改规则 3.3. 修改对象状态 基础样式 4.1. 行…...
x264、x265、libaom 编码对比实验
介绍 x264 是一个开源的高性能 H.264/MPEG-4 AVC 编码器,它以其优秀的压缩比和广泛的适用性而闻名。x265 是一种用于将视频流编码成 H.265/MPEG-H HEVC 压缩格式的免费软件库和应用程序,以其下一代压缩能力和卓越的质量而闻名 。作为 x264 的继任者,x265 支持 HEVC 的 Main、…...
c++网络编程实战——开发基于ftp协议的文件传输模块(二) 配置ftp服务与手动执行ftp命令
配置FTP服务 一.前言 博主的环境是阿里云服务器,操作系统版本为 ubuntu20.04,一下所有操作都基于以上环境下进行的操作,同时为了简化操作我将开放同一个云服务器的不同端口,让它同时充当服务端和客户端,大家如果想测试效果更好且…...
Sphinx 安装相关指令解释
安装指令 pip3 install sphinx-autobuildpip3 install sphinx_rtd_themepip3 install sphinx_markdown_tablepip3 install sphinx_markdown_tables pip3 install sphinx-autobuild 功能:安装 sphinx-autobuild 包。作用:sphinx-autobuild 是一个工具&am…...
npm下载包-更改默认缓存目录
npm(Node Package Manager)的缓存目录是npm用于存储已下载包的本地位置,以便在后续安装相同包时能够快速复用,从而节省时间和带宽。npm缓存目录的具体位置会根据操作系统的不同而有所差异。 Windows系统 在Windows系统中&#x…...
wordpress增加菜单/seo关键词排名在线查询
文章相关视频教程下载地址http://pan.baidu.com/s/1pKY4gzh (2)添加WM_CTLCOLOR的反射消息响应函数 要改变编辑框中文字颜色、背景等,需要对该控件的WM_CTLCOLOR消息进行响应,重写该消息的响应函数。 将鼠标焦点设置到CMyEdit.…...
wordpress 数字排序/怎么让关键词快速排名首页
Java中的内省 为了让程序员们更好的操作Java对象的属性,SUN公司开发了一套API,被业界内称为:内省;内省的出现有利于对类对象属性的操作,减少了代码的数量。下面用一个小例子来印证一下。 我有一个JavaBean(关于JavaBea…...
岳阳推广公司/免费seo网站推广
最近在网上遇到了一位小伙伴请人帮忙做线性代数考试,遇到这种情况,当然要拿出matlab。现在就照着这份线代小测来讲解一下matlab的矩阵运算。先看第二大题行列式计算:>> A[2,1;4,-2] 键入矩阵,同行用","分隔&#…...
做燕鲍翅的网站/上海做seo的公司
1.如果一个脚本要获取某个物体的引用,在脚本中定义Public GameObject go,在Hierarchy中将对应物体拖过去,这是最常用的方式,很简单 2.如果一个脚本要获取很多物体的引用,当然可以在脚本中定义很多个Public GameObject go变量&…...
手游代理/seo排名优化网站
1.可以与Kylin结合使用的可视化工具很多,例如: • ODBC:与Tableau、Excel、PowerBI等工具集成 • JDBC:与Saiku、BIRT等Java工具集成 • RestAPI:与JavaScript、Web网页集成 • Kylin开发团队还贡献了Zepplin的插件&am…...
dwcs2018怎么做动态网站/seo网络优化师招聘
题目链接:http://codeforces.com/problemset/problem/475/B 题目的意思是,给你n条水平固定流向,和m条竖直固定流向的街道,他们互相交叉在一起。。问任意交叉点能不能互相到达。。如下图: 在这里,我们知道&…...