【leetcode】平衡二叉树、对称二叉树、二叉树的层序遍历(广度优先遍历)(详解)

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
🌱🌱个人主页:奋斗的明志
🌱🌱所属专栏:数据结构、LeetCode专栏

在这里插入图片描述

📚本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。

在这里插入图片描述

二叉树面试题

  • 一、平衡二叉树
    • 1. 题目
    • 2. 解析
    • 3. 完整代码
    • 4.总结
  • 二、对称二叉树
    • 1. 题目
    • 2. 解析
    • 3. 完整代码(递归的思想)
    • 4.迭代实现
  • 三、二叉树的层序遍历
    • 1.题目
    • 2.解析(利用广度优先搜索)
    • 3.完整代码
  • 四、总结

一、平衡二叉树

110.平衡二叉树


1. 题目


在这里插入图片描述

在这里插入图片描述


2. 解析

  • 什么是平衡二叉树?

在本题中,平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。


在这里插入图片描述


①:如果这棵树为空,呢么判断它是平衡二叉树

// 如果是一颗空树
if (root == null) {return true;
}

②:计算根节点左右两边的左子树、右子树的高度。前面写过计算树的高度.
③:在求一棵树的高度时,如果数为空,则返回0,树的高度为0

// 首先判断是否为空树
if (root == null) {return 0;
}

④:如果左子树的高度小于0,表示左子树不平衡,直接返回-1。如果左子树平衡,则继续获取右子树的高度。

// 代码走到这,说明该树不为空,可能只有根节点,可能有多个子树int leftHeight = getHeight(root.left);if (leftHeight < 0) {return -1;}int rightHeight = getHeight(root.right);

⑤:如果左右子树都平衡且它们的高度差不超过1,则当前树也是平衡的,返回当前树的高度(左右子树中较大高度加1)。如果不满足上述条件,说明当前树不平衡,返回-1。

// 刚刚已经约定,不平衡会返回负数if (leftHeight >= 0 && rightHeight >= 0 && Math.abs(leftHeight - rightHeight) <= 1) {return Math.max(leftHeight, rightHeight) + 1;} else {// 不平衡return -1;}

⑥:时间复杂度为 O(N)


3. 完整代码


/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public boolean isBalanced(TreeNode root) {// 如果是一颗空树if (root == null) {return true;}int leftH = getHeight(root.left);int rightH = getHeight(root.right);return getHeight(root) >= 0;}// 求一颗数的高度public int getHeight(TreeNode root) {// 首先判断是否为空树if (root == null) {return 0;}// 代码走到这,说明该树不为空,可能只有根节点,可能有多个子树int leftHeight = getHeight(root.left);if (leftHeight < 0) {return -1;}int rightHeight = getHeight(root.right);// 刚刚已经约定,不平衡会返回负数if (leftHeight >= 0 && rightHeight >= 0 && Math.abs(leftHeight - rightHeight) <= 1) {return Math.max(leftHeight, rightHeight) + 1;} else {// 不平衡return -1;}}
}

4.总结

在遍历每个结点进行左右子树求高度的时候,就进行判断,能够优化时间复杂度
该题有递归的思想,一定要结合图形来解决

二、对称二叉树

101.对称二叉树


1. 题目


在这里插入图片描述

在这里插入图片描述


2. 解析


在这里插入图片描述
①:从图中可以看出当该树为空时,判断该树也是对称二叉树
②:当该树不为空的时候,判断左右子树是否对称
在这里插入图片描述
③:看 lt 的左子树是否和 rt 的右子树是否对称
④:看 lt 的右子树是否和 rt 的左子树是否对称


3. 完整代码(递归的思想)


/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public boolean isSymmetric(TreeNode root) {// 空树if (root == null) {return true;}return isSymmetricChild(root.left, root.right);}// 对传进来的 左右子树进行判断public boolean isSymmetricChild(TreeNode leftTree, TreeNode rightTree) {if ((leftTree == null && rightTree != null) || (leftTree != null && rightTree == null)) {return false;}if (leftTree == null && rightTree == null) {return true;}if (leftTree.val != rightTree.val) {return false;}return isSymmetricChild(leftTree.left, rightTree.right) && isSymmetricChild(leftTree.right, rightTree.left);}
}

4.迭代实现


在这里插入图片描述


class Solution {public boolean isSymmetric(TreeNode root) {return check(root, root);}public boolean check(TreeNode u, TreeNode v) {Queue<TreeNode> q = new LinkedList<TreeNode>();q.offer(u);q.offer(v);while (!q.isEmpty()) {u = q.poll();v = q.poll();if (u == null && v == null) {continue;}if ((u == null || v == null) || (u.val != v.val)) {return false;}q.offer(u.left);q.offer(v.right);q.offer(u.right);q.offer(v.left);}return true;}
}

三、二叉树的层序遍历

102.二叉树的层序遍历


1.题目

在这里插入图片描述

在这里插入图片描述


2.解析(利用广度优先搜索)


在这里插入图片描述


  • 外层循环 (while (!queue.isEmpty())):只要队列不为空,就继续进行层序遍历。

  • 内层循环:处理当前队列中的所有节点,这些节点是当前层的节点。

  • queueSize 记录当前层的节点个数,初始化为队列的大小。

  • list 用来存储当前层的节点值。

  • while (queueSize != 0) 循环处理当前层的所有节点:
    从队列中取出节点 cur,并将其值 cur.val 添加到 list 中。
    将 cur 的左右子节点(如果存在)依次加入队列中,以便处理下一层。

  • 层结束:内层循环结束后,表示当前层的所有节点已经处理完毕,将 list 添加到 retList 中,表示当前层的节点值已经记录完毕。

3.完整代码

/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() { }* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> retList = new ArrayList<>();// 如果为空树,直接返回 空的二维数组if (root == null) {return retList;}// 利用队列来辅助实现Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);// 首先将根节点添加到队列while (!queue.isEmpty()) {// 计算当前队列里面的个数int queueSize = queue.size();List<Integer> list = new ArrayList<>();while (queueSize != 0) {// 出队列一个结点,并添加到数组当中TreeNode cur = queue.poll();list.add(cur.val);// 出队列之后 有效个数减一queueSize--;// 然后向队列里面添加这个根节点的孩子结点// 对孩子节点进行判断if (cur.left != null) {queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}}retList.add(list);}return retList;}
}

四、总结

层序遍历就是广度优先遍历

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【Qt】如何搭建Qt开发环境

Qt的开发工具 需要搭建Qt开发环境&#xff0c;需要安装3个部分&#xff1a; C编译器&#xff08;gcc、cl.exe...&#xff09;注意&#xff0c;这里的C编译器不是指visual studio这种集成开发环境&#xff0c;编译器不等于IDE&#xff0c;编译器只是IDE调用的一个程序。Qt SDK…

将本地的业务写成成可供RPC远程调用的方法

第一步&#xff1a;首先我们先定义proto文件&#xff0c;这些proto文件将会为远程调用者提供调用的方法&#xff0c;为login方法。 2.重写UserServiceRpc类中的Login方法。 在Login中做的操作主要是&#xff0c;得到requst里面的参数&#xff0c;然后调用本地的Login方法&#…

SQL注入 报错注入、文件上传、布尔盲注、时间盲注

第7关 文件上传 ---面试官常问 1、MySQL上传shell的满足条件 如果面试官问你如何通过MySQL向网站上传一个shell脚本或者其他语言的一些脚本 ---就可以通过outfile导出的方式进行上传&#xff1b; outfile导出的前提条件&#xff1a;1、必须知道网站的物理路径&#xf…

网络编程相关

关于ipv4和v6 ipv4小细节-------公网和私有地址 端口 InetAddress 协议 UDP、TCP UDP通信程序 发送&#xff08;单播&#xff09;&#xff1a; 接收&#xff08;单播&#xff09;&#xff1a; UDP三种通信方式 单播和广播代码几乎相同&#xff0c;就是将&#xff1a; InetAddr…

【JVM基础11】——垃圾回收-说一下JVM的分代回收?

目录 1- 引言&#xff1a;分代回收1-1 什么是分代回收&#xff08;What&#xff09;1-2 为什么要用分代回收&#xff1f;&#xff08;Why&#xff09; 2- ⭐核心&#xff1a;分代回收工作机制2-1 工作机制2-2 MinorGC、Mixed GC、FullGC的区别是什么 3- 总结3-1 说一下 JVM 的分…

如何利用 ChatGPT 提高工作效率?

内容创作与总结&#xff1a; 写作辅助&#xff1a;可以帮助撰写文章、报告、邮件等各种文本&#xff0c;如为招商银行写宣传文案、写论文、写故事等。学习材料生成&#xff1a;能够生成学习材料&#xff0c;如摘要、抽认卡和测验&#xff0c;帮助学生复习和学习课程。评估和考核…

【Material-UI】深入理解useAutocomplete Hook:自定义与高级用法

文章目录 一、什么是useAutocomplete&#xff1f;导入useAutocomplete 二、基本用法代码解析 三、高级定制1. 自定义选项渲染2. 分组和排序3. 自定义输入框行为4. 与其他组件集成 四、注意事项1. 类型安全2. 性能优化 五、总结 Material-UI提供了强大的Autocomplete组件&#x…

Android 本地化、多语言切换:Localization

目录 1&#xff09;如何实现多语言切换、如何实现跟随手机语言切换而切换app语言 2&#xff09;Localization是什么 3&#xff09;不管手机语言如何&#xff0c;根据用户在App选择的语言&#xff0c;只切换App语言 4&#xff09;文字长短不一样&#xff0c;怎么办呢? 一、Lo…

Java面试之操作系统

1、冯诺依曼模型 运算器、控制器、存储器、输入设备、输出设备 32位和64位CPU最主要区别是一次性能计算多少字节数据&#xff0c;如果计算的数额不超过 32 位数字的情况下&#xff0c;32 位和 64 位 CPU 之间没什么区别的&#xff0c;只有当计算超过 32 位数字的情况下&#…

我花了一天时间,搭了个专属知识库,部署上线了,手把手教,不信你学不会

自动开了这个号以后&#xff0c;陆陆续续写了很多干货文章&#xff0c;一方面是可以帮助自己梳理思路&#xff0c;另一方面也方便日后查找相关内容。 但是&#xff0c;我想检索某个关键词是在之前哪篇文章写过的&#xff0c;就有点捉急了。CSDN 还好&#xff0c;可以检索到相关…

魔塔社区程序的`datasets.utils`导入`_datasets_server`错误问题的解决办法

运行魔塔社区的的一个识别图像文件中文字的模型程序&#xff1a; 出现如下的错误提示&#xff1a; from datasets.utils import _datasets_server,file_utils ImportError: cannot import name _datasets_server from datasets.utils (D:\PycharmProjects\minicpm_cuda_test\ve…

【保姆级讲解C语言中的运算符的优先级!】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Java-文件操作和IO

文件介绍 文件本身有多重含义,狭义的文件,特指硬盘上的文件(以及保存文件的目录),广义的文件:计算机上的很多硬件设备,软件资源,在操作系统中,都会被视为是"文件" 文件除了有数据内容之外,还有一部分信息,例如文件名,文件类型,文件大小,这些信息可以称作文件的元信…

【Android】通知的使用

使用通知 通知&#xff08;notification&#xff09;是Android系统中比较有特色的一个功能&#xff0c;当某个应用程序希望向用户发出一些提示信息&#xff0c;而该应用程序又不在前台运行时&#xff0c;就可以借助通知来实现。发出一条通知后&#xff0c;手机最上方的状态栏中…

YOLO:VOC格式数据集转换为YOLO数据集格式

作者&#xff1a;CSDN _养乐多_ 本文将介绍如何将目标检测中常用的VOC格式数据集转换为YOLO数据集&#xff0c;并进行数据集比例划分&#xff0c;从而方便的进行YOLO目标检测。 文章目录 一、将VOC格式数据集转换为YOLO格式数据集二、YOLO格式数据集划分&#xff08;训练、验…

FreeRTOS中的动态内存管理(heap_1、heap_2、heap_3、heap_4)

FreeRTOS 提供了多种动态内存分配方案&#xff0c;这些方案通过不同的内存管理器&#xff08;heap managers&#xff09;实现&#xff0c;主要位于 FreeRTOS/Source/portable/MemMang 目录下。以下是几种常见的动态内存分配方案&#xff1a; heap_1 特点&#xff1a; 简单性…

电脑添加虚拟网卡与ensp互联,互访

一、按照过程 1、打开设备管理器 2、点击网络适配器&#xff0c;点击左上角操作&#xff0c;点击“添加过时硬件” 3、下一页 4、选择“安装我手动从列表选择的硬件”&#xff0c;下一页 5、下拉&#xff0c;选择“网络适配器”&#xff0c;下一页 6、厂商选择“Microsoft”&…

内网穿透--LCX+portmap转发实验

实验背景 通过公司带有防火墙功能的路由器接入互联网&#xff0c;然后由于私网IP的缘故&#xff0c;公网 无法直接访问内部web服务器主机&#xff0c;通过内网其它主机做代理&#xff0c;穿透访问内网web 服务器主机 实验设备 1. 路由器、交换机各一台 2. 外网 kali 一台&…

设计测试用例的具体方法

一.等价类 等价类分为: 1.有效等价类 [6~15] 2.无效等价类 :小于6位,大于15位(不在数据范围内) 组合规则: 有效等价类组合的时候,尽可能一条测试用例尽可能多的覆盖有效等价类 无效等价类组合的时候,一条测试点,之恶能覆盖一个无效等价类 二.边界值 1.上点,离点,内点 上…

Shader入门精要总结(二)矩阵

1. 矩阵乘法 一个rn的矩阵A和一个nc的矩阵B相乘&#xff0c;它们的结果AB将会是一个rc大小的矩阵&#xff0c;不满足此规则不能相乘 矩阵乘法满足一些性质 矩阵乘法不满足交换律 即AB≠BA矩阵乘法满足结合律 (AB)CA(BC) 2. 特殊矩阵 方块矩阵 指行和列数目相等的矩阵&#x…