二叉树精选面试题

 

💎 欢迎大家互三: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;}}
}

 除了这种方法,还有另外一种思路,可以看作链表的交叉来做

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/48992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04安装与卸载nginx

换源 如果是国内的就不用换 中科大的源&#xff0c;由于我这里是Ubuntu&#xff0c;所以我就直接选Ubuntu22.04就行 点击下载&#xff0c;或者你直接复制这个sources.list的内容到linux中的/etc/apt/sources.list也可以&#xff0c;把原来的sources.list备份一下&#xff0c;…

nfs和samba

​webserver 服务器&#xff1a;作用是发布nginx的web项目 1、安装nginx&#xff08;只下载不安装&#xff09; [rootweb_server ~]# yum -y install --downloadonly --downloaddir./soft/ nginx 2、配置一个本地的nginx仓库 [rootweb_server ~]# yum -y install createrepo …

『 Linux 』信号概念与信号的产生

文章目录 信号概念前台进程与后台进程信号的本质硬件理解信号的产生 信号概念 "信号"一词指用来传达信息或只是的各种形式的提示或标志; 在生活中常见的信号例如红绿灯,交通标志,短信通知等 在操作系统中,"信号"是一种用于异步通知进程发生特定事件的机制;…

数据库-练习

题目要求&#xff1a;按照要求建立数据库与表&#xff0c;并完成相应的查询操作 解题步骤如下代码所示&#xff1a; //建立相关的数据库mydb8_worker mysql> show databases; -------------------- | Database | -------------------- | information_schema | | …

NMEA 2000航空插头插座选择

一、概述 NMEA 2000航空插头插座是船舶电子设备中不可或缺的部分&#xff0c;它们负责在船舶的各种电子系统间传输数据和电源信号。选择合适的NMEA 2000航空插头插座对于确保船舶电子系统的稳定性和可靠性至关重要。本文将详细探讨如何选择合适的NMEA 2000航空插头插座&#xf…

解决方案架构师系列 - AWS - Pinpoint

AWS Pinpoint介绍 Amazon Pinpoint 为营销人员和开发人员提供了一款可自定义的工具&#xff0c;助力他们大规模地开展跨渠道、行业和活动的客户通信。 Amazon Pinpoint是一个全面的客户参与平台&#xff0c;‌旨在帮助营销人员和开发人员大规模地开展跨渠道、‌行业和活动的客…

Intellij IDEA 的Plugins加载不出来的解决方法

一、点开插件---右上角设置---HTTP代理设置 二、勾选自动检测代理设置 输入url&#xff1a; https://plugins.jetbrains.com/ 配置完成后&#xff0c;点击确定。 然后点击检查连接&#xff0c;再一次输入那个URL&#xff0c;一般来说可以连接成功了 然后 重启IDEA以刷新缓…

UE TSharedPtr

文章目录 概述TSharedPtrTSharedPtr包含2部分 构造&#xff0c;析构&#xff0c;拷贝构造&#xff0c;移动构造构造拷贝构造移动构造 小结 概述 之前写过一篇c的智能指针的&#xff0c;这篇写下ue的。本质上来说是差不多的&#xff0c;可以简单看看。 TSharedPtr 如下图&…

基于SpringBoot+Vue的篮球竞赛预约平台(带1w+文档)

基于SpringBootVue的篮球竞赛预约平台(带1w文档) 基于SpringBootVue的篮球竞赛预约平台(带1w文档) 本系统提供给管理员对首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;项目分类管理&#xff0c;竞赛项目管理&#xff0c;赛事预约管理&#xff0c;系统管理等诸多功…

2-40 基于Matlab编写的3维FDTD(时域有限差分算法)计算了球的RCS经典散射问题

基于Matlab编写的3维FDTD(时域有限差分算法)计算了球的RCS经典散射问题&#xff0c;采用PEC作边界&#xff0c;高斯波束激励。程序已调通&#xff0c;可直接运行。 2-40 3维FDTD 时域有限差分算法 - 小红书 (xiaohongshu.com)

Meta Quest3 激活更新不动的问题

1. Meta Quest3激活过程中遇到更新不动的情况&#xff0c;如下图所示&#xff1a; 2. 关机 3. 开机检查连接的wifi&#xff0c;是否存在受限的情况&#xff0c;如果存在受限情况&#xff0c;则说明当前的mofa只支持TCP&#xff0c;需要设置支持UDP模式。 具体操作是设置魔法…

细节决定成败:电商详情页全攻略

电子商务产品细节页面作为电子商务信息的主要承载页面&#xff0c;也是电子商务业务转型的主要战场。因此&#xff0c;商业详细页面的设计和规划是电子商务产品设计的核心&#xff0c;承担着转化率&#xff0c;甚至是产品设计的KPI。 电子商务作为传统商品交易在互联网领域的表…

探究比表面积测试的方法、仪器与原理-测试狗

探究比表面积测试的方法、仪器与原理 比表面积是指单位质量物质所具有的表面积&#xff0c;它是衡量物质性能的重要参数之一。比表面积测试在材料科学、环境保护、化工等领域具有广泛的应用。比表面积测试方法多样&#xff0c;仪器各异&#xff0c;下面测试狗就为大家介绍一些比…

Windows版MySQL5.7解压直用(如何卸载更换位置重新安装)

文章目录 停止mysql进程及服务迁移整个mysql文件夹删除data重启计算机重新安装 停止mysql进程及服务 net stop mysql mysqld -remove mysql迁移整个mysql文件夹 删除data 重启计算机 shutdown -r -t 0重新安装 https://blog.csdn.net/xzzteach/article/details/137723185

Linux_线程的同步与互斥

目录 1、互斥相关概念 2、代码体现互斥重要性 3、互斥锁 3.1 初始化锁 3.2 申请、释放锁 3.3 加锁的思想 3.4 实现加锁 3.5 锁的原子性 4、线程安全 4.1 可重入函数 4.2 死锁 5、线程同步 5.1 条件变量初始化 5.2 条件变量等待队列 5.3 唤醒等待队列…

视觉网络的有效调制

摘要 链接&#xff1a;https://arxiv.org/pdf/2403.19963 在这项工作中&#xff0c;我们提出了高效调制&#xff08;EfficientMod&#xff09;&#xff0c;这是一种用于高效视觉网络的新型设计。我们重新审视了调制机制&#xff0c;该机制通过卷积上下文建模和特征投影层处理输…

Java并发(三)Java并发核心机制

J.U.C 简介 Java 的 java.util.concurrent 包&#xff08;简称 J.U.C&#xff09;中提供了大量并发工具类&#xff0c;是 Java 并发能力的主要体现&#xff08;注意&#xff0c;不是全部&#xff0c;有部分并发能力的支持在其他包中&#xff09;。从功能上&#xff0c;大致可以…

Spring Boot 日志 (初级)

什么是日志呢&#xff1f;其实就是一条条的打印语句&#xff0c;我们就可以根据打印出来的日志&#xff0c;去分析程序存在的问题等。虽然作为后端开发人员&#xff0c;日志并不是那么重要&#xff0c;但是在学习的过程中&#xff0c;也是比较重要的&#xff0c;可以使用在我们…

[Spring] Spring配置文件

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

主流大数据调度工具DolphinScheduler之数据采集

今天继续给大家分享主流大数据调度工具DolphinScheduler&#xff0c;以及数据的ETL流程。 一&#xff1a;调度工具DS 主流大数据调度工具DolphinScheduler&#xff0c; 其定位&#xff1a;解决数据处理流程中错综复杂的依赖关系 任务支持类型&#xff1a;支持传统的shell任…