数据结构:二叉树—面试题(一)
目录
1、相同的树
2、另一棵树的子树
3、翻转二叉树
4、平衡二叉树
5、对称二叉树
6、二叉树遍历
7、二叉树的分层遍历
1、相同的树
习题链接
https://leetcode.cn/problems/same-tree/description/
描述:
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

解题思路
根据题意,他要我们判断这两棵树是否相同,我们知道要判断两棵树是否相同,就是要判断树的结构和对应结点的内容是否相同。
首先我们要来看,给我们的两棵树是否是一棵树有结点,一棵树没有结点,如果是这样的话,我们就认为这两棵树不相同,同时如果这两颗树的根节点都为空,那么我们就认为,这两棵树相同。
经历了这两个条件后,此时的这两颗树一定是都存在结点,这时我们在判断此时的根节点值是否相同,如果不同,就是不相同的树,如果相同,我们就继续往下走,判断对应的左子树和右子树是否相同,在递归的形势下,传入两棵树根的左边结点作为新的根节点,进行判断,同理右边也是一样。在这种情况下完成对两棵树的结构和内容的判断。
完整代码
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、另一棵树的子树
习题链接
https://leetcode.cn/problems/subtree-of-another-tree/
描述:
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。


解题思路
根据题意,他是要我们判断给出的两棵树中一棵是否为另一棵的子树,而这个子树是包含某个结点开始和他所有的后代的,这样来看其实就是判断一棵树的子树和他给出的另一棵树是否相同。(注意:如果两棵树从根节点开始就是相同的,我们也认为他符合题意)
首先,我们从根节点开始进行判断,我们要先判断我们的根节点是否为空,因为在下面我们是要有递归实现的总有一次我们会递归到为空的时候,这就代表我们此时的根节点为空,而我们要判断的subRoot这棵树却不为空,这就代表了以此时结点为根节点的树是和我们要判断的树是不同的,因此我们要返回false.而我们判断的方法就是我们上面写的题相同的树,因此我们将根节点传isSameTree进行判断。
当我们判断完根结点后我们要判断跟的左子树,因此我们要将根的左结点传入进行递归,判断完再判断右树,如果都不存在就返回false;
完整代码
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、翻转二叉树
习题链接
https://leetcode.cn/problems/invert-binary-tree/description/
描述:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

解题思路
根据图示我们能发现这道题就是让我们将根的左右结点进行交换,说到交换这就简单了,想必大家都理解,而他是要交换整棵树因此我们交换完根节点后,还要交换他左子树的结点和右子树的结点,因此我们可以利用递归传入根的左右结点,再继续往下找左右结点进行交换。
完整代码
class Solution {public TreeNode invertTree(TreeNode root) {if(root == null){return root;}TreeNode tmp = root.left;root.left = root.right;root.right = tmp;invertTree(root.left);invertTree(root.right);return root;}
}
4、平衡二叉树
习题链接
https://leetcode.cn/problems/balanced-binary-tree/description/
描述:给定一个二叉树,判断它是否是 平衡二叉树

解题思路
首先我们要先来了解什么是平衡二叉树,所谓平衡二叉树就是,一个根节点左边的长度和右边的长度的差值要小于等于1.
而根据对平衡二叉树的了解,我们发现我们应该去求他左子树和右子树的长度,让他们相减。
关于二叉树长度的计算我们再二叉树中已经进行了讲解,大家可以去看看。数据结构:二叉树
因为我们要判断整棵树是否为平衡二叉树,因此我们要从根结点判断是否为平衡二叉树,还要对子树的子树进行平衡二叉树的判断,如果都是平衡二叉树,我们就认为他是平衡二叉树,对于这样的判断我们就要用到递归的方式来进行了。
因此我们获得根结点的左右子树长度进行相减并且利用递归传入根的左结点和右结点进行子树的子树判断
完整代码
class Solution {public boolean isBalanced(TreeNode root) {if(root == null){return true;}int leftMax = getH(root.left);int rightMax = getH(root.right);return Math.abs(leftMax - rightMax) <=1 && isBalanced(root.left) && isBalanced(root.right);}public int getH(TreeNode root){if(root == null){return 0;}int leftH = getH(root.left);int rightH = getH(root.right);return Math.max(leftH,rightH)+1;}
}
5、对称二叉树
习题链接
https://leetcode.cn/problems/symmetric-tree/description/
描述:给你一个二叉树的根节点 root , 检查它是否轴对称。

解题思路
这道题其实和我们第1题是相同的,我们还是判断是否相同,只是从两棵树的判断,到了一棵树左右子树的判断,当时我们要注意因为他要判断是否为镜像,因此,我们判断是否相同是要判断一棵子树的左边和另一棵子树的右边,一棵子树的右边和另一棵子树的左边是否结构相同内容相同
完整代码
class Solution {public boolean isSymmetric(TreeNode root) {if(root == null){return true;}return isSameTree(root.left,root.right);}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.right) && isSameTree(p.right,q.left);}
}
6、二叉树遍历
习题链接
https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=60&&tqId=29483&rp=1&ru=/activity/oj&qru=/ta/tsing-kaoyan/question-ranking
描述:
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。

解题思路
根据题意,我们知道他是要我们根据先序遍历,建立一棵二叉树,再输出二叉树的中序遍历。
首先我们要根据先序遍历创建二叉树,在创建二叉树前我们要创建结点,因为二叉树是由一个个结点形成的。
创建完结点后,我们就要创建二叉树,我们知道先序遍历的顺序是:根左右,因此我们要先创建完左子树再创建右子树,那么什么时候我们停止创建左子树呢?
停止的时刻其实是当我们遇到空树的时候,而先序遍历给我们的空树就是“#”,因此只要我们没遇到“#”,就创建左子树,并让先序遍历往下走,遇到“#”了我们就停止,但依然让先序遍历往下走,并返回到上面一层,去创建右子树。
当右子树也遇到“#”了,我们就停止创建二叉树,但依然让先序遍历往下走,并返回到上面一层,此时左右子树都走完了,再返回上一层,去创建右子树,在这样不断的递归和返回就成功创建了二叉树。
当我们创建完二叉树后,接下来就是用中序遍历去打印了(左根右)
完整代码
import java.util.Scanner;
class TreeNode{char val;TreeNode left;TreeNode right;public TreeNode(char val){this.val = val;}
}
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static int i = 0;public static 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 static void oread(TreeNode root){if(root == null){return;}oread(root.left);System.out.print(root.val + " ");oread(root.right);}public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseString str = in.nextLine(); TreeNode root = createTree(str);oread(root);}}
}
7、二叉树的分层遍历
习题链接
https://leetcode.cn/problems/binary-tree-level-order-traversal/description/
描述:
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

解题思路
这道题就是让我将二叉树由层序遍历输出,而层序遍历的方式我们再上一篇二叉树是已经进行了讲解大家可以去看看,数据结构:二叉树
而这道虽然仍是以层序遍历输出,但是他输出要求是同一层的放到一起输出。
因此我们可以在层序遍历的基础上再创建一个链表curList,然后再计算次数队列的长度,根据长度决定出队的个数,并让出队的元素放到链表curList中,并将此时出队的元素左右结点放入队列中,当这个循环结束了就代表上一个队列为空了,再将curList的值放入到list链表中,然后利用循环再判断此时的队列,再创建一个新的curList,重复上面的操作,这样就实现了同一层的放到一起输出
完整代码
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> list = new ArrayList<>();if(root == null){return list;}Queue<TreeNode> q = new LinkedList<>();q.offer(root);while(!q.isEmpty()){List<Integer> curList = new ArrayList<>();int size = q.size();while(size != 0){TreeNode cur = q.poll();curList.add(cur.val);if(cur.left != null){q.offer(cur.left);}if(cur.right != null){q.offer(cur.right);}size--;}list.add(curList); }return list;}
}
好了。今天的分享就到这里了,还请大家多多关注,我们下一篇再见!
相关文章:
数据结构:二叉树—面试题(一)
目录 1、相同的树 2、另一棵树的子树 3、翻转二叉树 4、平衡二叉树 5、对称二叉树 6、二叉树遍历 7、二叉树的分层遍历 1、相同的树 习题链接https://leetcode.cn/problems/same-tree/description/ 描述: 给你两棵二叉树的根节点 p 和 q ,编写一…...
DDD 和 TDD
领域驱动设计(DDD) DDD 是一种软件开发方法,强调通过与领域专家的密切合作来构建一个反映业务逻辑的模型。其核心思想是将业务逻辑和技术实现紧密结合,以便更好地解决复杂的业务问题。 DDD 的关键概念: 1. 领域模型 …...
LangChain概述
文章目录 为什么需要LangChainLLM应用开发的最后1公里LangChain的2个关键词LangChain的3个场景LangChain的6大模块 为什么需要LangChain 首先想象一个开发者在构建一个LLM应用时的常见场景。当你开始构建一个新项目时,你可能会遇到许多API接口、数据格式和工具。对于…...
Java基于SSM框架的互助学习平台小程序【附源码、文档】
博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇dz…...
lightweight-charts-python 包 更新 lightweight-charts.js 的方法
lightweight-charts-python 是 lightweight-charts.js 的 python 包装,非常好用 lightweight-charts 更新比较频繁,导致 lightweight-charts-python 内置的 lightweight-charts 经常不是最新的。 新的 lightweight-charts 通常可以获得性能改进和bug修复…...
React第二十七章(Suspense)
Suspense Suspense 是一种异步渲染机制,其核心理念是在组件加载或数据获取过程中,先展示一个占位符(loading state),从而实现更自然流畅的用户界面更新体验。 应用场景 异步组件加载:通过代码分包实现组件…...
C# Dynamic关键字
一、引言:开启动态编程之门 在 C# 的编程世界里,长久以来我们习惯了静态类型语言带来的严谨与稳定。在传统的 C# 编程中,变量的类型在编译时就已经确定,这就像是给每个变量贴上了一个固定的标签,在整个代码执行过程中…...
大一计算机的自学总结:位运算的应用及位图
前言 不仅异或运算有很多骚操作,位运算本身也有很多骚操作。(尤其后几个题,太逆天了) 一、2 的幂 class Solution { public:bool isPowerOfTwo(int n) {return n>0&&n(n&-n);} }; 根据二进制表示数的原理&#…...
解决报错“The layer xxx has never been called and thus has no defined input shape”
解决报错“The layer xxx has never been called and thus has no defined input shape”(这里写自定义目录标题) 报错显示 最近在跑yolo的代码时遇到这样一个错误,显示“the layer {self.name} has never been called”.这个程序闲置了很久,每次一遇到…...
【AI论文】FilmAgent: 一个用于虚拟3D空间中端到端电影制作自动化的多智能体框架
摘要:虚拟电影制作涉及复杂的决策过程,包括剧本编写、虚拟摄影以及演员的精确定位和动作设计。受近期基于语言智能体社会的自动化决策领域进展的启发,本文提出了FilmAgent,这是一个新颖的、基于大型语言模型(LLM&#…...
hive:数据导入,数据导出,加载数据到Hive,复制表结构
hive不建议用insert,因为Hive是建立在Hadoop之上的数据仓库工具,主要用于批处理和大数据分析,而不是为OLTP(在线事务处理)操作设计的。INSERT操作会非常慢 数据导入 命令行界面:建一个文件 查询数据>>复制>>粘贴到新…...
VUE之路由Props、replace、编程式路由导航、重定向
目录 1、路由_props的配置 2、路由_replaces属性 3、编程式路由导航 4、路由重定向 1、路由_props的配置 1)第一种写法,将路由收到的所有params参数作为props传给路由组件 只能适用于params参数 // 创建一个路由器,并暴露出去// 第一步…...
虹科分享 | 汽车NVH小课堂之听音辨故障
随着车主开始关注汽车抖动异响问题,如何根据故障现象快速诊断异响来源,成了汽修人的必修课。 一个比较常用的方法就是靠“听”——“听音辨故障”。那今天,虹科Pico也整理了几个不同类型的异响声音,一起来听听看你能答对几个吧 汽…...
Transfoemr的解码器(Decoder)与分词技术
在自然语言处理(NLP)领域,解码器(Decoder)和分词技术是两个至关重要的概念。解码器是序列生成任务的核心组件,而分词则是将文本数据转换为可处理形式的基础步骤。 一、解码器(Decoder&…...
Django-Admin WebView 集成项目技术规范文档 v2.1
Django-Admin WebView 集成项目技术规范文档 v2.1 系统架构规范 1.1 技术栈要求 前端框架:Flutter: 3.27.1 (空安全版本)Dart: 3.3.1 (支持元编程)webview_flutter: ^4.10.0 (带Hybrid Composition支持)后端要求:Django: 4.2.x LTS (安全支持至2026)Python: 3.11.x (启用PEP …...
【开源免费】基于Vue和SpringBoot的社区智慧养老监护管理平台(附论文)
本文项目编号 T 163 ,文末自助获取源码 \color{red}{T163,文末自助获取源码} T163,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
作業系統:設計與實現-母本
2023 南京大學《作業系統:設計與實現》 課程主頁(含講義):https://jyywiki.cn/OS/2023/ 【Python 实现操作系统模型 [南京大学2023操作系统-P4] (蒋炎岩)-哔哩哔哩】 https://b23.tv/jakxDbh 用Python实现操作系统模型讲义 一、操作系统基础概念 1.1 定义 操作系统(Oper…...
excel如何查找一个表的数据在另外一个表是否存在
比如“Sheet1”有“张三”、“李四”“王五”三个人的数据,“Sheet2”只有“张三”、“李四”的数据。我们通过修改“Sheet1”的“民族”或者其他空的列,修改为“Sheet2”的某一列。这样修改后筛选这个修改的列为空的或者为出错的,就能找到两…...
当AI学会“顿悟”:DeepSeek-R1如何用强化学习突破推理边界?
开篇:一场AI的“青春期叛逆” 你有没有想过,AI模型在学会“推理”之前,可能也经历过一段“中二时期”?比如,解题时乱写一通、语言混搭、答案藏在火星文里……最近,一支名为DeepSeek-AI的团队,就…...
(Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计
源码 论文 下载地址: cc基于JAVA的网络通讯系统设计与实现(源码系统论文)https://download.csdn.net/download/weixin_39682092/90299782https://download.csdn.net/download/weixin_39682092/90299782 第1章 绪论 1.1 课题选择的…...
Deepseek的api调用报错乱码问题
最近的deepseek也是很火,但是在调用api的过程中也会出现一些大大小小的问题,所以这里也给出一种问题和他的解决方案,报错的类型如下图所示 API Streaming Failed Command failed with exit code 1: powershell (Get-CimInstance -ClassName W…...
STM32调试手段:重定向printf串口
引言 C语言中经常使用printf来输出调试信息,打印到屏幕。由于在单片机中没有屏幕,但是我们可以重定向printf,把数据打印到串口,从而在电脑端接收调试信息。这是除了debug外,另外一个非常有效的调试手段。 一、什么是pr…...
如何在本地部署deepseek r1模型?
DeepSeek(深度求索)正式发布了其最新推理模型DeepSeek-R1,引发业界广泛关注。这款模型不仅在性能上与OpenAI的GPT-4相媲美,更以其开源策略和创新的训练方法,为AI发展带来了新的可能性。DeepSeek-R1 在后训练阶段大规模…...
【MySQL】悲观锁和乐观锁的原理和应用场景
悲观锁和乐观锁,并不是 MySQL 或者数据库中独有的概念,而是并发编程的基本概念。 主要区别在于,操作共享数据时,“悲观锁”认为数据出现冲突的可能性更大,而“乐观锁”则是认为大部分情况不会出现冲突,进而…...
基于Flask的哔哩哔哩评论数据可视化分析系统的设计与实现
【Flask】基于Flask的哔哩哔哩评论数据可视化分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统可以搜索查看作者、播放量、评论等相关信息,并将相关的分析…...
2218. 从栈中取出 K 个硬币的最大面值和
2218. 从栈中取出 K 个硬币的最大面值和 题目链接:2218. 从栈中取出 K 个硬币的最大面值和 代码如下: class Solution { public:int maxValueOfCoins(vector<vector<int>>& piles, int k) {vector<vector<int>> memo(pile…...
MySQL 用户相关的操作详解
MySQL 5.x 用户操作 创建用户 在 MySQL 5.x 中,使用 GRANT 语句创建用户并授权: 语法 GRANT ALL PRIVILEGES ON *.* TO usernamehost IDENTIFIED BY password;username:用户名 host:指定用户可访问的主机,例如 loca…...
YOLO目标检测4
一. 参考资料 《YOLO目标检测》 by 杨建华博士 本篇文章的主要内容来自于这本书,只是作为学习记录进行分享。 二. 环境搭建 (1) ubuntu20.04 anaconda安装方法 (2) 搭建yolo训练环境 # 首先,我们建议使用Anaconda来创建一个conda的虚拟环境 conda cre…...
ONES 春节假期服务通知
ONES 春节假期服务通知 灵蛇贺岁,瑞气盈门。感谢大家一直以来对 ONES 的认可与支持,祝您春节快乐! 「2025年1月28日 ~ 2025年2月4日」春节假期期间,我们的值班人员将为您提供如下服务 : 紧急问题 若有紧急问…...
DeepSeek异军突起,重塑AI格局
DeepSeek异军突起,重塑AI格局这两天AI 圈发生了比过年更令人兴奋的事情,“Meta内部反水事件”、“黄仁勋的底盘问题”,以及AI格局的大动荡,一切都是因为那个叫DeepSeek的“中国自主AI”!它由幻方量化开发,以…...
