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

文章目录

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

题目

标题和出处

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

出处: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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python更改YOLOv5、v7、v8,实现调用val.py或者test.py后生成pr.csv,然后再整合绘制到一张图上(使用matplotlib绘制)

1. 前提 效果图 不错的链接&#xff1a;YOLOV7训练模型分析 关于map的绘图、loss绘图&#xff0c;可参考&#xff1a;根据YOLOv5、v8、v7训练后生成的result文件用matplotlib进行绘图 v5、v8调用val.py&#xff0c;v7调用test.py&#xff08;作用都是一样的&#xff0c;都是…

LED广告机在密闭箱体内的散热方法

在现代电子产品中&#xff0c;尤其是LED广告机这类大型设备的连续使用过程中&#xff0c;发热问题一直备受关注。以下简要介绍LED广告机在密闭的箱体内如何进行散热降温的有效方法。 1. 设计出风口 LED广告机背面通常设计有镂空矩形&#xff0c;即出风口&#xff0c;以确保空气…

Ubuntu20.04/Linux中常用软件的安装

文章目录 一、安裝与卸载微信二、安裝与卸载QQ三、安装Chrome浏览器并加入apt更新四、安裝VScode4.1 安装常用插件4.2 减小Ipch缓存&#xff1a; 五、安装代码对比工具Meld六、安裝WPS七、安装PDF阅读器Foxit Reader八、安装文献管理软件Zotero九、安装有道云笔记十、安装远程控…

分享66个菜单导航JS特效,总有一款适合您

分享66个菜单导航JS特效&#xff0c;总有一款适合您 66个菜单导航JS特效下载链接&#xff1a;https://pan.baidu.com/s/1dpGGbptx6hEKcBnTMNLIdA?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

mysql有哪些锁,理解各种表锁和行锁

全局锁 主要用于数据库的备份&#xff0c;但会使得备份期间不能有任何事务插入删除更新数据&#xff0c;这很影响实际业务。所以通常不用这个全局锁来完成数据库的备份。假设数据库的存储引擎支持可重复读&#xff0c;那么常见的方法是通过MVCC来实现的&#xff0c;也就是备份…

Shopee过期的折扣活动如何删除?Shopee促销商品如何下架?——站斧浏览器

商家们可以轻松删除虾皮过期活动以及下架促销商品&#xff0c;保持店铺的整洁和顾客的购物体验。那么shopee过期的折扣活动如何删除&#xff0c;shopee促销商品如何下架。 Shopee过期的折扣活动如何删除&#xff1f; 在删除虾皮过期活动时&#xff0c;商家们需要遵循以下步骤…

Java基本数据类型、包装类及拆装箱详解

Java的基本数据类型和对应的包装类是Java语言中处理数据的两个关键概念。基本数据类型提供了简单而高效的方式来存储数据&#xff0c;而包装类使得基本数据类型具有对象的特性。本文将深入探讨基本数据类型与包装类的应用场景及详细描述&#xff0c;并对自动拆箱和装箱的源码实…

SpringBoot:SpringMVC(上)

文章目录 前言一、SpringMVC是什么&#xff1f;1.1 MVC的定义&#xff1a;1.2 MVC 和 Spring MVC 的关系 二、Spring MVC 创建和连接2.1创建springmvc2.2接下来&#xff0c;创建⼀个 UserController 类&#xff0c;实现⽤户到 Spring 程序的互联互通&#xff0c;具体实现代码如…

Python 自动化办公:文件快速整理分类

平时桌面或文件夹内鱼龙混杂&#xff0c;各种类型的文件都有怎么办&#xff1f; 本篇文章中&#xff0c;我们将学习如何使用 Python 编写一个文件整理分类的脚本。 该脚本能够自动获取文件类型&#xff0c;并将文件按照类型整理到不同的子文件夹中。 先看下效果&#xff0c;…

低代码如何降低门槛、快速交付、实现可持续IT架构?

目录 低代码开发模式期望达成的目标 1.降低开发门槛 2.加快系统交付 3.建立可持续发展的IT架构 写在最后 低代码的概念&#xff0c;最早提出的时间是在2014年左右&#xff0c;随后一直处于上升期&#xff0c;随着前两年阿里、腾讯的相继入场&#xff0c;竞争逐步加大。低代…

【Virtual Box】显示界面后无反应

本文记录本人在使用Virtual Box中遇到的问题 1.Virtual Box启动后无反应点击菜单栏是可用的&#xff0c;但界面里的无法操作 【解决方法】&#xff1a;以管理员身份启动virtual Box

零基础学编程,中文编程工具构件之弹出菜单构件教程,中文编程工具下载

一、前言&#xff1a; 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具&#xff0c;零基础…

如何保持操纵机构丝杆的精度?

滚珠丝杆是操纵机构中的重要组成部分&#xff0c;可以传递较高的扭矩&#xff0c;并且具有低摩擦、高效率和快速响应的特性&#xff0c;这使得操纵机构能够实现高速、高精度的运动控制&#xff0c;这对于整个系统的性能和精度具有决定性的影响&#xff0c;保持操纵机构丝杆的精…

100G数据中心升级改造策略

视频流媒体的兴起和物联网设备的大幅增长带来数据量爆炸性增长&#xff0c;人们对算力的需求越来越大&#xff0c;网络的升级改造也成为每个数据中心关注的重点。为了应对网络压力&#xff0c;数据中心需要升级到100G及以上速率&#xff0c;为企业和用户提供高性能计算、存储和…

python读取所有sheet内容到另一个文件中

实现效果&#xff1a; 将原excel中的步骤、预期效果列按回车拆成多行数据&#xff0c;其余字段值填充其他数据 实现结果&#xff1a; # This is a sample Python script.# Press ShiftF10 to execute it or replace it with your code. # Press Double Shift to search everyw…

SpringBoot-监听Nacos动态修改日志级别

目录 一、pom文件 二、项目配置文件 三、日志配置文件 四、日志监听类 五、日志动态修改服务类 线上系统的日志级别一般都是 INFO 级别&#xff0c;有时候需要查看 WARN 级别的日志&#xff0c;所以需要动态修改日志级别。微服务项目中使用 Nacos 作为注册中心&#xff0c…

计算机与CFD模拟仿真:技术的融合与应用

计算机与CFD模拟仿真:技术的融合与应用 引言 随着科技的不断发展,计算机技术与计算流体力学(CFD)模拟仿真在各个领域的应用越来越广泛。本文将详细介绍计算机技术与CFD模拟仿真在各领域中的应用,包括航空航天、汽车设计、能源电力、环境工程等。通过深入探讨计算机技术与…

matplotlib可视化PCA后的重建图像及重建误差

代码 import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.datasets import fetch_olivetti_faces# 加载Olivetti人脸数据集 data fetch_olivetti_faces() X data.data images data.images# 设置不同的PCA组件数 comp…

ENVI植被指数阈值法

植被指数阈值法提取纯净像元 首先用ENVI打开无人机遥感影像 1. 假彩色显示 打开数据管理工具&#xff0c;无人机的4波段为红边波段 2. 波段计算 打开band math&#xff0c;输入 float(b1-b2)/(b1b2) 选择对应波段 3. 阈值筛选 阈值按经验值选的0.7&#xff0c;ndvi…

Linux:dockerfile编写搭建mysql练习(10)

搭建了httpyum仓库 Dockerfile 主要文件 基于centos基础镜像 centos.repo yum仓库 db_init.sh mysql初始化脚本 run.sh 启动脚本 vim Dockerfile写入FROM centosMAINTAINER teacher lyRUN mkdir /etc/yum.repos.d/bak ; mv /etc/yu…