二叉树题目:二叉树的完全性检验

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:二叉树的完全性检验

出处:958. 二叉树的完全性检验

难度

5 级

题目描述

要求

给定一个二叉树的根结点 root \texttt{root} root,确定它是否是一个完全二叉树。

在一个完全二叉树中,除了最后一层以外,每一层都是完全填满的,并且最后一层的所有结点都是尽可能靠左的。如果最后一层是第 h \texttt{h} h 层,则可以包含 1 \texttt{1} 1 2 h \texttt{2}^\texttt{h} 2h 个结点。

示例

示例 1:

示例 1

输入: root = [1,2,3,4,5,6] \texttt{root = [1,2,3,4,5,6]} root = [1,2,3,4,5,6]
输出: true \texttt{true} true
解释:除了最后一层以外的每一层都是满的(即,结点值为 {1} \texttt{\{1\}} {1} {2, 3} \texttt{\{2, 3\}} {2, 3} 的两层),且最后一层中的所有结点( {4, 5, 6} \texttt{\{4, 5, 6\}} {4, 5, 6})都尽可能地靠左。

示例 2:

示例 2

输入: root = [1,2,3,4,5,null,7] \texttt{root = [1,2,3,4,5,null,7]} root = [1,2,3,4,5,null,7]
输出: false \texttt{false} false
解释:值为 7 \texttt{7} 7 的结点没有尽可能靠左。

数据范围

  • 树中结点数目在范围 [1, 100] \texttt{[1, 100]} [1, 100]
  • 1 ≤ Node.val ≤ 1000 \texttt{1} \le \texttt{Node.val} \le \texttt{1000} 1Node.val1000

解法

思路和算法

将根结点所在层定义为第 0 0 0 层。如果完全二叉树有 l l l 层,则当 i < l − 1 i < l - 1 i<l1 时,完全二叉树的第 i i i 层有 2 i 2^i 2i 个结点,当 i = l − 1 i = l - 1 i=l1 时,完全二叉树的第 i i i 层的结点数在范围 [ 1 , 2 i ] [1, 2^i] [1,2i] 内且所有结点都尽可能靠左。

为了判断给定的二叉树是否是完全二叉树,可以假设给定的二叉树是完全二叉树,判断是否符合完全二叉树的性质。

由于完全二叉树要求每一层结点都符合完全二叉树的性质,因此可以使用层序遍历判断给定的二叉树是否是完全二叉树。

从根结点开始依次遍历每一层的结点,在层序遍历的过程中需要区分不同结点所在的层,确保每一轮访问的结点为同一层的全部结点。遍历每一层结点之前首先得到当前层的结点数,即可确保每一轮访问的结点为同一层的全部结点。遍历每一层的同时需要维护每一层填满时的结点数,根结点所在层的结点数是 1 1 1,当一层结点遍历结束之后,下一层填满时的结点数为当前层填满时的结点数的两倍。以下将一层填满时的结点数称为该层的满结点数,则第 i i i 层的满结点数是 2 i 2^i 2i

遍历每一层结点之前首先得到当前层的结点数,判断当前层是否为最后一层。如果当前层的实际结点数等于当前层的满结点数,则当前层不一定是最后一层;如果当前层的实际结点数小于当前层的满结点数,则当前层一定是最后一层。对于两种情况,判断是否符合完全二叉树性质的做法分别如下。

  • 如果当前层不一定是最后一层,则判断当前层的子结点是否符合完全二叉树的性质。从左到右依次遍历当前层的结点,对于当前层的每个结点依次判断左子结点和右子结点是否为空。如果在一个空子结点之后遇到一个非空子结点,则子结点不符合所有的结点尽可能靠左,因此子结点不符合完全二叉树的性质,返回 false \text{false} false

  • 如果当前层一定是最后一层,则判断当前层的结点是否符合完全二叉树的性质。当前层的每个结点都必须是叶结点,不能有非空子结点。如果当前层至少有一个结点有非空子结点,则不符合完全二叉树的性质,返回 false \text{false} false

如果遍历结束之后没有发现不符合完全二叉树性质的情况,则给定的二叉树是完全二叉树,返回 true \text{true} true

由于在遍历填满结点的每一层时,都会判断下一层结点是否符合完全二叉树的性质,当下一层结点不符合所有的结点尽可能靠左时就提前返回不是完全二叉树,因此在遍历到每一层时,当前层的结点一定符合完全二叉树的性质,只需要根据当前层的实际结点数和当前层的子结点判断是否符合完全二叉树的性质,因此上述做法可以确保结果正确。

代码

class Solution {public boolean isCompleteTree(TreeNode root) {int completeSize = 1;Queue<TreeNode> queue = new ArrayDeque<TreeNode>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();if (size == completeSize) {boolean isComplete = true;for (int i = 0; i < size; i++) {TreeNode node = queue.poll();TreeNode[] children = {node.left, node.right};for (TreeNode child : children) {if (child == null) {isComplete = false;} else {if (!isComplete) {return false;}queue.offer(child);}}}} else {for (int i = 0; i < size; i++) {TreeNode node = queue.poll();if (node.left != null || node.right != null) {return false;}}}completeSize *= 2;}return true;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是队列空间,队列内元素个数不超过 n n n

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

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

相关文章

C#中GDI+图形图像技术(Graphics类、Pen类、Brush类)

目录 一、创建Graphics对象 1.创建Pen对象 2.创建Brush对象 &#xff08;1&#xff09;SolidBrush类 &#xff08;2&#xff09;HatchBrush类 ​​​​​​​&#xff08;3&#xff09;LinerGradientBrush类 用户界面上的窗体和控件非常有用&#xff0c;且引人注目&#…

销售人员一定要知道的6种获取电话号码的方法

对于销售来说&#xff0c;电话销售是必须要知道的销售方法&#xff0c;也是销售生涯中的必经之路。最开始我们并不清楚这么电话是从哪里来的&#xff0c;也不清楚是通过哪些方法渠道获取。那么今天就来分享给各位销售人员获取客户电话号码的方法。 1.打印自己的名片&#xff0…

CSS实现一些小功能

1.信封边框的实现 1.1 使用背景渐变 <!DOCTYPE html><html><head><meta charset"UTF-8"><title></title><style type"text/css">.uu {width: 200px;height: 70px;padding:1em;border: 1em solid transparent;…

【objectarx.net】加载线型文件

/// <summary> /// 加载指定线型文件中的指定名称的线型 /// </summary> /// <param name"lineTypName">线型名</param> /// <param name"db"></param> /// <param name"lineTypeFile">线型文件</…

一文读懂 ChatGPT 工作原理

生成式 AI 是如何工作的 生成式 AI 是目前最热门的技术之一&#xff0c;ChatGPT 等应用的出现使人们对于如何在各种领域中应用生成式 AI 有了许多新的思考。 但这些领域的从业者并不都具备 AI 相关的知识背景。所以我们制作了这个教程&#xff0c;向无 AI 知识背景的读者介绍…

Temu数据面板:Temu商家必备的数据分析工具

在Temu这个电商平台上&#xff0c;越来越多的商家意识到数据分析的重要性。数据分析可以帮助商家更好地了解店铺的运营情况&#xff0c;从而制定更有效的运营策略&#xff0c;提高销售业绩。而在这个过程中&#xff0c;Temu数据面板成为了一个不可或缺的工具。 先给大家推荐一款…

【ElementUI】一行代码解决图片预览

【ElementUI】一行代码解决图片预览 只需要在图片标签上加入:preview-src-list 只需要在图片标签上加入:preview-src-list 完整代码如下&#xff1a; <el-table-column label"封面" align"center" prop"cover" :sort-orders"[descend…

IDEA 保存自动ESLint格式化

作为后端人员&#xff0c;偶尔修改一下前端代码&#xff0c;ESLint总提示格式不正确。有没有什么办法实现自动格式化呢&#xff1f; 安装插件Save Actions Tool 设置中搜索eslint 勾选 Run eslint --fix on save 这样以后&#xff0c;只要保存文件就会自动格式化了。 参考 …

“探秘某音开放平台接口:掌握潮流电商的秘密武器“

一、概述 接口是某音开放平台提供的一套API接口&#xff0c;开发者可以通过这些接口快速构建与某音平台的数据交互能力。本文将详细介绍某音接口的使用方法、技术细节以及注意事项。 二、接口地址 某音接口的地址为&#xff1a;https://open.douyin.com/platform/doc/standa…

java语言中受检异常和非受检异常的区别是什么?

在Java语言中&#xff0c;异常可以分为两种类型&#xff1a;受检异常&#xff08;Checked Exception&#xff09;和非受检异常&#xff08;Unchecked Exception&#xff09;。 受检异常&#xff08;Checked Exception&#xff09;&#xff1a;这是编译器要求必须进行处理的异常…

Redis——Redis简介

Redis是目前最流行的键值对&#xff08;key-value&#xff09;数据库&#xff0c;以出色的性能著称&#xff0c;官方提供的数据是可以支持100000以上的QPS。Redis具有高性能的主要原因如下&#xff1a; Redis是基于内存的存储数据库&#xff0c;绝大部分的命令处理只是纯粹的内…

BabySpartan:对non-uniform computation的Lasso-based SNARK

1. 引言 前序博客有&#xff1a; Lasso、Jolt 以及 Lookup Singularity——Part 1Lasso、Jolt 以及 Lookup Singularity——Part 2深入了解LassoJoltmultilinear多项式承诺方案benchmark对比 见Srinath Setty和Justin Thaler 2023年论文《BabySpartan: Lasso-based SNARK fo…

协同过滤算法:个性化推荐的艺术与科学

目录 引言&#xff1a; 一、协同过滤算法的基本原理 二、协同过滤算法的应用领域 三、协同过滤算法的优缺点 四、协同过滤算法的未来发展方向 五、结论 引言&#xff1a; 在当今数字化时代&#xff0c;信息过载成为了一个普遍的问题。为了帮助人们更好地发现符合个性化需…

HTTP 和 HTTPS的区别

一、HTTP 1.明文传输&#xff0c;不安全 2.默认端口号&#xff1a;80 3.TCP三次握手即可 二、HTTPS 1.加密传输&#xff0c;更安全(在HTTP层与TCP层之间加上了SSL/TTL安全协议) SSL和TTL是在不同时期的两种叫法&#xff0c;含义相同。 2.默认端口号&#xff1a;443 3.TCP三…

【广州华锐互动】风电场检修VR情景模拟提供接近真实的实操体验

风电场检修VR情景模拟系统由广州华锐互动开发&#xff0c;这是一种新兴的培训方式&#xff0c;它通过虚拟现实技术将风力发电场全范围进行1:1仿真建模还原&#xff0c;模拟监视风力发电场各种运行工况下的运行参数和指标&#xff0c;同时可进行升压站系统的巡视&#xff0c;倒闸…

Windows系列:Zabbix agent一键部署-windows版本(windows 安装zabbix客户端安装、bat文件修改文件内容)

Zabbix agent一键部署-windows版本&#xff08;windows 安装zabbix客户端安装、bat文件修改文件内容&#xff09; 一. Zabbix agent一键部署-windows版本二. windows 安装zabbix客户端安装1.下载安装zabbix agent2.配置zabbix agent2.1 修改配置文件2.2 将zabbix agent安装为wi…

windows系统配置别名

习惯了linux下的别名管理机制&#xff0c;而windows下却没有类似的功能。我看有些博客介绍说windows下配置别名还得修改注册表&#xff0c;太麻烦了&#xff08;个人认为&#xff0c;windows的这一套&#xff0c;终究会被抛弃&#xff09;。我自己摸索出一条比较便利的方式。 …

同旺科技 USB TO SPI / I2C --- 调试W5500_TCP Client接收数据

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 发送数据6个字节的数据&#xff1a;0x11,0x22,0x33,0x44,0x55,0x66 在专业版调试软件中编辑指令&#xff0c…

坦克大战-部分

通过键盘操控坦克移动&#xff0c;转弯&#xff0c;射击 消灭所有敌人可以过关 23个类&#xff0c;3个gif图片 wsad控制移动 j射击 砖墙限制移动&#xff0c;可以打穿&#xff1b;铁墙&#xff0c;限制移动&#xff0c;不能打穿&#xff1b;水&#x…

【PyTorch】多层感知机

文章目录 1. 模型和代码实现1.1. 模型1.1.1. 背景1.1.2. 多层感知机1.1.3. 激活函数 1.2. 代码实现1.2.1. 完整代码1.2.2. 输出结果 2. Q&A 1. 模型和代码实现 1.1. 模型 1.1.1. 背景 许多问题要使用线性模型&#xff0c;但无法简单地通过预处理来实现。此时我们可以通过…