【二叉树】常见题目解析(2)

题目1:104. 二叉树的最大深度 - 力扣(LeetCode)

题目1描述:

题目1分析及解决:

        (1)base case:当前节点为null时,以当前节点为根节点的树最大深度是0。

        (2)节点不为null时,节点应该统计左右子树的最大深度,并在其中取一个最大值 + 1即可得到以当前节点为根节点的树最大深度是多少(+ 1是因为当前节点也算一个深度)。

        (3)既然要用到左右子树的递归结果,那么肯定是后序遍历整颗树。

        Code:

class Solution {public int maxDepth(TreeNode root) {//空树最大深度为0if(root == null)return 0;//获取左右子树的最大深度int leftDepth = maxDepth(root.left);int rightDepth = maxDepth(root.right);//在左右子树的结果中选一个较大值 + 1(当前节点也算一个深度)return Math.max(leftDepth,rightDepth) + 1;}
}

题目2:111. 二叉树的最小深度 - 力扣(LeetCode)

题目2描述:

题目2分析与解决:

        (1)base case:当前节点为null时,最小深度是0;当节点的左、右子节点都为null时,说明当前节点是叶子节点,最小深度是1.

        (2)节点不为null时,如果当前节点的左节点不为null,就获取左节点的最小深度;如果当前节点的右节点不为null,就获取右节点的最小深度;最后在左、右子节点返回的结果中选一个较小值 + 1即可得到以当前节点为根节点的树最小深度是多少。

        (3)由于还是要获取左、右子节点的返回结果,所以仍然是后序遍历。为什么要在左、右子节点不为null时,才能去递归获取他们的最小深度呢?看下图

        总结:不加if判断会被空节点影响最终结果。

        Code:

class Solution {public int minDepth(TreeNode root) {//节点为null时,最小深度是0if(root == null)return 0;//节点为叶子节点时,最小深度是1if(root.left == null && root.right == null)return 1;int leftDepth = Integer.MAX_VALUE;int rightDepth = Integer.MAX_VALUE;if(root.left != null)leftDepth = minDepth(root.left);if(root.right != null)rightDepth = minDepth(root.right);return Math.min(leftDepth,rightDepth) + 1;}
}

题目3:958. 二叉树的完全性检验 - 力扣(LeetCode)

题目3描述:

题目3分析与解决:

        (1)完全二叉树的特点如下图所示:

        (2)逐层遍历每一个节点(bfs),当一个节点的左子节点为null而右子节点不为null时,说明不是完全二叉树。

        (3)当遍历到一个节点,它的左、右子结点有一个为null,若后续节点不是叶子节点,说明不是完全二叉树。如下图所示,遍历到a节点时,其左子节点不为null、右子节点为null;后面遍历b节点时,如果b是叶子节点,则不破坏完全二叉树的性质,如果b不是叶子节点,则中间有空缺,不符合完全二叉树的定义。

        Code:

class Solution {//题目规定节点个数在100以内public static int MAX = 101;    //用数组模拟队列public static TreeNode [] queue = new TreeNode[MAX];//用head、tail两个变量维护队列的长度及出入队顺序public static int head,tail;public boolean isCompleteTree(TreeNode root) {//空树也是完全二叉树if(root == null)return true;//初始队列大小为0head = tail = 0;//根节点入队queue[tail++] = root;//标记变量:遍历到一个节点,只要它的左、右子节点有一个为null,就设置为trueboolean flag = false;//队列不为空while(head < tail){//弹出队头节点TreeNode node = queue[head++];//返回false的两个条件,满足一个即可//1.左子节点为null的同时右子节点不为null//2.有节点设置flag为true的同时当前节点不是叶子节点if((node.left == null && node.right != null) ||(flag && (node.left != null || node.right != null)))return false;if(node.left != null)queue[tail++] = node.left;if(node.right != null)queue[tail++] = node.right;if(node.left == null || node.right == null)flag = true;}//如果逐层遍历过程中没有返回false,那么这棵树是完全二叉树,返回truereturn true;}
}

题目4:222. 完全二叉树的节点个数 - 力扣(LeetCode)

题目4描述:

题目4分析与解决:

        (1)最基本的思路是:递归左、右子树获取他们的节点个数,当递归到叶子节点时,就返回1(叶子节点的左、右子节点都为null),每层节点收集左、右子树的递归结果再 + 1(当前结点也算一个结点)返回即可。

        (2)基于上述思路无论是什么类型的二叉树都能统计其结点个数,但题目强调了是一颗完全二叉树,我们该如何利用这一性质?根据题目3我们知道,一颗完全二叉树不一定是一颗满二叉树,但它一部分的子树一定是一颗满二叉树;利用这一性质,当我们发现以当前结点为根节点的树是满二叉树时,直接计算结点个数返回,无需获取左、右子树的递归结果,减少时间复杂度

        (3)一颗满二叉树的结点个数如何计算呢? 不就是2^层数 - 1吗? 所以当我们递归到一个结点时,我们首先判断它是否是一颗满二叉树,是则直接计算结点个数;不是,则递归左、右子树,获取左、右子树的递归结果,再+1即可。

        Code:

class Solution {public int countNodes(TreeNode root) {//空结点肯定不算一个结点if(root == null)return 0;TreeNode l = root.left;int leftDepth = 0;//一直往左树遍历,看最深是多少while(l != null){l = l.left;leftDepth++;}TreeNode r = root.right;int rightDepth = 0;//一直往右树遍历,看最深是多少while(r != null){r = r.right;rightDepth++;}//如果左、右子树的深度相同//说明以当前结点为根节点的树是一颗满二叉树,直接计算结点个数并返回if(leftDepth == rightDepth)return (2 << leftDepth) - 1;else//否则获取左、右子树的递归结果 + 1 返回return countNodes(root.left) + countNodes(root.right) + 1;}
}

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

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

相关文章

Redis使用increment方法返回null的原因以及解决方案

public static void main(String[] args) {redisTemplate.setEnableTransactionSupport(true); //开启事务支持redisTemplate.multi(); //标记事务块的开始redisTemplate.opsForValue().set("name","zs");redisTemplate.opsForValue().set("pass&qu…

使用系统ProgressBar实现三色进度条

使用系统ProgressBar实现如图三色进度条&#xff1a; //布局中<ProgressBarandroid:layout_width"0dp"android:layout_height"8dp"android:layout_marginLeft"16dp"app:layout_constraintBottom_toBottomOf"id/photo"app:layout_c…

Docker部署Plik临时文件上传系统并且实现远程访问

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik8. 结语 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上…

为自己创建的游戏编程源码申请软件著作权详细流程(免费分享模板)

以为我这篇文章制作的游戏申请软件著作权为例 Ren‘py 视觉小说 交互式故事游戏制作过程学习笔记(Windows下实现)(多结局游戏)-CSDN博客 一、网站注册 申请软著时&#xff0c;所有的著作权人都需要在中国版权保护中心官网注册账号&#xff0c;并进行实名认证后&#xff0c;才…

ahk热字串:字符串输入后,按空格后,打开网址 or 不按空格直接打开网址

二、字符串输入后&#xff0c;按空格后&#xff0c;打开网址 ::aa:: { run "www.baidu.com" }三、字符串aa输入后&#xff0c;直接 打开网址 :*:aa:: { run "www.baidu.com" }一、字符串替换&#xff0c;按空格后替换。不按空格直接替换 ;输入name&…

SpringBoot2.x整合WebService实现远程接口调用

一、添加依赖 <!-- SpringBoot 2.4 以下版本--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web-services</artifactId> </dependency><dependency><groupId>org.apach…

Android 应用资源概览

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、资源类型分组四、配置限定符名称表…

口罩标准讲解及推荐

一、我国医用口罩质量标准 1、YY/T0969-2013《一次性使用医用口罩》 2、YY0469-2011《医用外科口罩》 3、GB19083-2010《医用防护口罩技术要求》三类医用口罩各项指标对比如下&#xff1a; 结论&#xff1a;防护效果来说&#xff1a;医用防护口罩>医用外科口罩>一次性…

【交换排序 简单选择排序 堆排序 归并排序】

文章目录 交换排序简单选择排序堆排序归并排序 交换排序 冒泡排序的算法分析&#xff1a; 冒泡排序最好的时间复杂度是O&#xff08;n&#xff09;冒泡排序最好的时间复杂度是O&#xff08;n平方&#xff09;冒泡排序平均时间复杂度为O&#xff08;n的平方&#xff09;冒泡排…

02数仓平台Zookeeper

概述 ZooKeeper是一种分布式协调服务&#xff0c;用于管理大型主机集。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper通过其简单的架构和API解决了这个问题。ZooKeeper允许开发人员专注于核心应用程序逻辑&#xff0c;而不必担心应用程序的分布式性质。 Zookeepe…

基于springboot,vue高校图书馆管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatisredis 本项…

Kubernetes集群部署—部署Master 节点 (三)

文章目录 1 生成kube-apiserver证书 &#xff08;master节点操作&#xff09;1.1 自签证书颁发机构&#xff08;CA&#xff09;1.2 使用自签CA签发kube-apiserver HTTPS证书 2 从Github下载二进制文件3 解压二进制包 &#xff08;master节点操作&#xff09;4 部署kube-apiserv…

【开源视频联动物联网平台】JAIN-SIP库写一个SIP服务器

JAIN-SIP&#xff08;Java API for Integrated Networks - Session Initiation Protocol&#xff09;是用于实现SIP&#xff08;Session Initiation Protocol&#xff09;的Java API。以下是使用JAIN-SIP库编写一个简单的SIP服务器的基本步骤&#xff1a; 1.添加JAIN-SIP库依赖…

华为OD机试真题-求最多可以派出多少支团队-2023年OD统一考试(C卷)

题目描述: 用数组代表每个人的能力,一个比赛活动要求参赛团队的最低能力值为N,每个团队可以由1人或2人组成,且1个人只能参加1个团队,请计算出最多可以派出多少支符合要求的团队? 输入描述: 5 3 1 5 7 9 8 第一行数组代表总人数,范围[1,500000] 第二行数组代表每个人的能…

[Rust] 快速基础入门教程

Rust 是一个无运行时的强类型语言, 包含很多高级特性, 例如泛型, lambda 等. 又因为其独有的所有权机制, 所以 Rust 的内存安全要比 C 完善许多. 风格 Rust 与 C 族语言不一样, C 族语言在定义方法, 变量时, 都是 类型 关键字 这样的格式, 也就是类型前置. Rust 采用的是类型后…

如何使用Go与MQTT进行通信

简介 本文介绍了如何使用 Go 编程语言与 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;进行通信。MQTT 是一种轻量级的消息传输协议&#xff0c;广泛应用于物联网和实时通信场景。通过本文的指导&#xff0c;您将学习如何使用 Go 语言创建 MQTT 客户端&am…

MySQL更改用户权限

如果之前已经为一个用户设置了 localhost 作为主机名&#xff0c;并且现在想将其改为 %&#xff08;表示允许该用户从任何主机连接&#xff09;&#xff0c;可以按照以下步骤操作&#xff1a; 登录 MySQL&#xff1a; 首先&#xff0c;使用 root 用户或其他具有管理员权限的用户…

【哈希】字母异位词分组

力扣 class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map new HashMap<>();for (String str : strs) {String hash getHash(str);map.computeIfAbsent(hash, k -> new ArrayList<…

[英语学习][6][Word Power Made Easy]的精读与翻译优化

[序言] 针对第18页的阅读, 进行第二次翻译优化以及纠错, 这次译者的翻译出现的严重问题: 没有考虑时态的变化导致整个翻译跟上下文脱节, 然后又有偷懒的嫌疑, 翻译得很随意. [英文学习的目标] 提升自身的英语水平, 对日后编程技能的提升有很大帮助. 希望大家这次能学到东西,…

PTA:过滤重复整数

题干 本题要求实现一个函数&#xff0c;删去给定整数数组中的重复整数&#xff0c;不重复的元素放于原数组中&#xff0c;不要改变原来的次序。该函数返回不重复的整数个数。 函数接口定义&#xff1a; 函数原型为&#xff1a; int Unique_Int ( int a[ ], int n ); 其中 a[ …