数据结构:二叉树—面试题(一)

目录

1、相同的树

2、另一棵树的子树

3、翻转二叉树

4、平衡二叉树 

 5、对称二叉树

 6、二叉树遍历

7、二叉树的分层遍历


1、相同的树

习题链接https://leetcode.cn/problems/same-tree/description/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/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/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/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/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-rankinghttps://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/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;}
}

好了。今天的分享就到这里了,还请大家多多关注,我们下一篇再见!

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

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

相关文章

2025年新开局!谁在引领汽车AI风潮?

汽车AI革命已来。 在2025年伊始开幕的CES展上&#xff0c;AI汽车、AI座舱无疑成为了今年汽车行业的最大热点。其中不少车企在2025年CES上展示了其新一代AI座舱&#xff0c;为下一代智能汽车的人机交互、场景创新率先打样。 其中&#xff0c;东软集团也携带AI驱动、大数据支撑…

HarmonyOS Next 应用UI生成工具介绍

背景 HarmonyOS Next适配开发过程中难买难要参考之前逻辑&#xff0c;但是可能时间较长文档不全&#xff0c;只能参考Android或iOS代码&#xff0c;有些逻辑较重的场景还可以通过AI工具将Android 的Java代码逻辑转成TS完成部分复用。对于一些UI场景只能手动去写&#xff0c;虽…

python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加

【1】引言 前序已经学习了直接在画布上使用掩模&#xff0c;会获得彩色图像的多种叠加效果&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;四十&#xff09;掩模&#xff1a;三通道图像的局部覆盖-CSDN博客 这时候如果更进一步&#xff0c;直接…

宝塔Linux+docker部署nginx出现403 Forbidden

本文主要讲述了宝塔docker部署nginx出现403 Forbidden的原因&#xff0c;以及成功部署前端的方法步骤。 目录 1、问题描述2、问题检测2.1 检测监听端口是否异常2.2 检测Docker容器是否异常2.2.1 打开宝塔Linux的软件商店&#xff0c;找到Docker管理器&#xff0c;查看前端容器是…

PVE 虚拟机安装 Debian 无图形化界面服务器

Debian 安装 Debian 镜像下载 找一个Debian镜像服务器&#xff0c;根据需要的版本和自己硬件选择。 iso-cd/&#xff1a;较小&#xff0c;仅包含安装所需的基础组件&#xff0c;可能需要网络访问来完成安装。有镜像 debian-12.9.0-amd64-netinst.isoiso-dvd/&#xff1a;较…

docker环境搭建,docker拉取mysql,docker制作自定义C++镜像

目录 centos 安装和使用 dockerdocker拉取mysql使用可执行文件制作docker镜像Dockerfile文件优化Dockerfile简介Dockerfile优化 centos 安装和使用 docker yum install docker systemctl start docker systemctl status docker# 查询docker版本 docker version # 查询docker基…

2025牛客寒假算法营2

A题 知识点&#xff1a;模拟 打卡。检查给定的七个整数是否仅包含 1,2,3,5,6 即可。为了便于书写&#xff0c;我们可以反过来&#xff0c;检查这七个整数是否不为 4 和 7。 时间 O(1)&#xff1b;空间 O(1)。 #include <bits/stdc.h> using namespace std;signed main()…

STM32 FreeRTOS中断管理

目录 FreeRTOS的中断管理 1、STM32中断优先级管理 2、FreeRTOS任务优先级管理 3、寄存器和内存映射寄存器 4、BASEPRI寄存器 5、FreeRTOS与STM32中断管理结合使用 vPortRaiseBASEPRI vPortSetBASEPRI 6、FromISR后缀 7、在中断服务函数中调用FreeRTOS的API函数需注意 F…

【ComfyUI】python调用生图API,实现批量出图

官方给的示例&#xff1a; https://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyU…

在Docker 容器中安装 Oracle 19c

在 Docker 容器中安装 Oracle 19c 是可行的&#xff0c;但它相较于其他数据库&#xff08;如 MySQL、PostgreSQL 等&#xff09;会复杂一些&#xff0c;因为 Oracle 数据库有一些特定的要求&#xff0c;如操作系统和库的依赖&#xff0c;以及许可证问题。 不过&#xff0c;Ora…

macos的图标过大,这是因为有自己的设计规范

苹果官方链接&#xff1a;App 图标 | Apple Developer Documentation 这个在官方文档里有说明&#xff0c;并且提供了sketch 和 ps 的模板。 figma还提供了模板&#xff1a; Figma

告别手动编辑:如何用Python快速创建Ansible hosts文件?

在自动化运维领域&#xff0c;Ansible是一款非常强大的工具&#xff0c;它可以帮助我们管理和配置大量的服务器。为了让Ansible能够有效地管理这些服务器&#xff0c;我们需要一个hosts清单文件&#xff0c;该文件定义了Ansible要管理的目标主机。在实际应用中&#xff0c;我们…

macOS安装Gradle环境

文章目录 说明安装JDK安装Gradle 说明 gradle8.5最高支持jdk21&#xff0c;如果使用jdk22建议使用gradle8.8以上版本 安装JDK mac系统安装最新&#xff08;截止2024.9.13&#xff09;Oracle JDK操作记录 安装Gradle 下载Gradle&#xff0c;解压将其存放到资源java/env目录…

【嵌入式】总结——Linux驱动开发(三)

鸽了半年&#xff0c;几乎全忘了&#xff0c;幸亏前面还有两篇总结。出于快速体验嵌入式linux的目的&#xff0c;本篇与前两篇一样&#xff0c;重点在于使用、快速体验&#xff0c;uboot、linux、根文件系统不作深入理解&#xff0c;能用就行。 重新梳理一下脉络&#xff0c;本…

【29】Word:李楠-学术期刊❗

目录 题目​ NO1.2.3.4.5 NO6.7.8 NO9.10.11 NO12.13.14.15 NO16 题目 NO1.2.3.4.5 另存为手动/F12Fn光标来到开头位置处→插入→封面→选择花丝→根据样例图片&#xff0c;对应位置填入对应文字 (手动调整即可&#xff09;复制样式&#xff1a;开始→样式对话框→管理…

ThinkPHP 8请求处理-获取请求对象与请求上下文

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用Composer初始化ThinkPHP 8应用_thinkphp8 compos…

某书x-s 、x-t 算法 python纯算56版本

文章目录 声明iv的获取key的获取python 算法还原声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! xhs xs自从2023年5月31号更新之后直到2024年7月之前好像就没有再怎么更新了 但是7月之…

【记录自开发的SQL工具】工具字符拼接、Excel转sql、生成编码、生成测试数据

记录自己开发的一个SQL聚合工具 功能介绍&#xff1a; 文本加引号 给多行文本前后添加引号&#xff0c;并用逗号连接&#xff0c;直接复制到 sql 中的 in 条件中 Excel转SQL 适用于将Excel表格的数据&#xff0c;批量导入到数据库的场景 此工具能快速将excel表格转换为i…

Linux安装mysql5.7

CentOS7安装MySQL&#xff08;完整版&#xff09; - oldmonk - 博客园 下载|安装 下载并安装MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm使用上面的命令就直接下载了安装用的Yum Repository&#xff0c;大…

汽车定速巡航

配备定速巡航功能的车型&#xff0c;一般在方向盘附近设有4~6个按键&#xff08;可能共用键位&#xff09;。 要设置定速巡航&#xff0c;不仅需要方向盘上的按键&#xff0c;还要油门配合。 设置的一般流程&#xff1a; 开关&#xff1a;类似步枪上的“保险”&#xff0c;按…