牛客题解 | 判断是不是完全二叉树

news/2025/2/25 19:14:06/文章来源:https://www.cnblogs.com/wc529065/p/18737034

题目

题目链接

题目主要信息:
  • 判断给定二叉树是否为完全二叉树
  • 首先我们需要知道什么是完全二叉树:叶子节点只能出现在最下层和次下层,且最下层的叶子节点集中在树的左部。
  • 需要注意的是,满二叉树肯定是完全二叉树,而完全二叉树不一定是满二叉树。
举一反三:

学习完本题的思路你可以解决如下题目:

BM26. 求二叉树的层次遍历

BM27. 按之字形顺序打印二叉树

方法:层次遍历(推荐使用)

知识点:队列

队列是一种仅支持在表尾进行插入操作、在表头进行删除操作的线性表,插入端称为队尾,删除端称为队首,因整体类似排队的队伍而得名。它满足先进先出的性质,元素入队即将新元素加在队列的尾,元素出队即将队首元素取出,它后一个作为新的队首。

思路:

对完全二叉树最重要的定义就是叶子节点只能出现在最下层和次下层,所以我们想到可以使用队列辅助进行层次遍历——从上到下遍历所有层,每层从左到右,只有次下层和最下层才有叶子节点,其他层出现叶子节点就意味着不是完全二叉树。

具体做法:

  • step 1:先判断空树一定是完全二叉树。
  • step 2:初始化一个队列辅助层次遍历,将根节点加入。
  • step 3:逐渐从队列中弹出元素访问节点,如果遇到某个节点为空,进行标记,代表到了完全二叉树的最下层,若是后续还有访问,则说明提前出现了叶子节点,不符合完全二叉树的性质。
  • step 4:否则,继续加入左右子节点进入队列排队,等待访问。

图示:

alt

Java代码实现:

import java.util.*;
public class Solution {public boolean isCompleteTree (TreeNode root) {//空树一定是完全二叉树if(root == null) return true;//辅助队列Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root);TreeNode cur;//定义一个首次出现的标记位boolean notComplete = false;while(!queue.isEmpty()){cur = queue.poll();//标记第一次遇到空节点if(cur == null){ notComplete = true;continue;}//后续访问已经遇到空节点了,说明经过了叶子if(notComplete) return false;queue.offer(cur.left);queue.offer(cur.right);}return true;}
}

C++代码实现:

class Solution {public:bool isCompleteTree(TreeNode* root) {//空树一定是完全二叉树if(root == NULL) return true;queue<TreeNode*> q;//根节点先访问q.push(root); //定义一个首次出现的标记位bool flag = false; //层次遍历while(!q.empty()){ int sz = q.size();for (int i = 0; i < sz; i++) {TreeNode* cur = q.front();q.pop();//标记第一次遇到空节点if (cur == NULL) flag = true; else{//后续访问已经遇到空节点了,说明经过了叶子if (flag) return false;q.push(cur->left);q.push(cur->right);}}}return true;}
};

Python代码实现

import queueclass Solution:def isCompleteTree(self , root: TreeNode) -> bool:# 空树一定是完全二叉树if not root:  return Trueq = queue.Queue()# 根节点先访问q.put(root) # 定义一个首次出现的标记位flag = False # 层次遍历while not q.empty(): sz = q.qsize()for i in range(sz):cur = q.get()# 标记第一次遇到空节点if not cur: flag = Trueelse:# 后续访问已经遇到空节点了,说明经过了叶子if flag:return Falseq.put(cur.left)q.put(cur.right)return True

复杂度分析:

  • 时间复杂度:\(O(n)\),其中\(n\)为二叉树节点数,层次遍历最坏情况下遍历每一个节点
  • 空间复杂度:\(O(n)\),最坏情况下,层次队列的最大空间为\(O(n)\)

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

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

相关文章

linux下安装 elasticsearch

一、基础环境 操作系统环境:Red Hat Enterprise Linux Server release 6.4 (Santiago) ES版本:elasticsearch-7.8.0-linux-x86_64.tar.gz Jdk:Java(TM) SE Runtime Environment (build 1.8.0_144-b01) 二、安装 1、上传安装包到/opt目录下 2、解压cd /opt # tar -zxvf elas…

mysql 啥样的索引能提高查询性能呢?

前言 在前面几章中,我们知道了页里面是如何存储的,页又是如何编排的。 这样我们知道了,如何定位到页,如何定位到行了,这些对我们索引的了解非常有帮助的。 知道这些后,那么我们如何利用索引查询呢? 也就是说我们如何利用这种数据结构呢? 是不是全部的查询都能通过索引去…

06 常用损失函数介绍

在前文中我们使用的损失函数都是均方误差(MSE,Mean Squared Error),本篇介绍一些其他的损失函数形式,以及他们的不同用途。 1. 回归任务常用损失函数 1.1 均方误差(MSE, Mean Squared Error) 均方误差(MSE)是回归任务中最常用的损失函数之一,用于衡量模型预测值与真实…

啦啦啦啦啦啦啦啦啦

啦啦啦 啦啦啦啦啦啦啦啦啦 ABC221G 神秘题,将坐标轴转 \(45\),然后 bitset 优化背包,记录路径把刚刚被更新的找出来,然后 _Find_next,每个点只会记一次。 AGC050a 神秘题,想到 \(\log\),然后发现一下位置 \(x\) 走十次能到的区间是 \([1024x,1024x+1023]\),区间长度够…

破解 vLLM + DeepSeek 规模化部署的“不可能三角”

通过 FC GPU 预留实例的闲置计费功能,企业用户能在充分利用 vLLM 的强大功能的同时找到成本、性能、稳定的最佳平衡点,并保持开发和运维的高效性。无论是将 FC vLLM 函数直接对外提供服务,还是深度集成到现有系统中,或是通过 CAP 还是魔搭来简化部署,都能找到满足您业务需…

条形码编码规则全解析:从黑白条纹到数字世界的转换密码

条形码的编码规则是将字符(数字、字母等)转换为特定黑白条纹或矩阵结构的标准化方法,核心目的是让机器能够快速、准确地识别和解析信息。以下是常见条形码编码规则的简介: 一维条形码编码规则 1. ​基本原理通过不同宽度的黑白条纹​(或空格)组合表示字符。 每个字符对应…

[汽车电子/车联网] CANoe

概述:CANoe CAN 全家桶区别: CANoe vs CanalyzerCANoe和CANalyzer使用方法类似(简直可以说 相同)。 都可用于simulation,区别在于CANalyzer只能模拟单个Node,而CANoe可以同时模拟多个Node。如果入门学习了CANoe,就不用入门学习CANalyzer了。安装指南 安装 CANoeDemo on …

璞华易研PLM荣登软服之家多项榜单,PLM+AI为流程行业提供产品创新引擎

近日,国内知名软件与服务评测平台软服之家发布了多个PLM(Product Lifecycle Management,产品全生命周期管理)榜单,帮助用户了解PLM领域表现卓越的软件产品和服务。在软服之家的多项榜单中,璞华易研PLM凭借其自主研发能力与行业深耕优势,在流程行业、电子信息、装备制造等…

ELK 原理介绍及实践详解

介绍了ELK(Elasticsearch, Logstash, Kibana)在大规模日志管理中的重要性,阐述了ELK解决日志分析的挑战,如日志收集、传输、存储和分析。文章详细讲解了ELK的组成部分,包括Filebeat的工作原理、Logstash的输入、过滤和输出阶段,以及Kibana的分析和可视化功能。此外,还提…

工信部人才交流中心PostgreSQL认证考试 - 聊一下更多精彩

在数字经济高速发展的今天,数据库作为信息基础设施的核心组件,其技术自主性与人才储备已成为国家战略竞争力的关键。工业和信息化部人才交流中心(以下简称“工信人才”)推出PostgreSQL认证考试,不仅是对技术发展趋势的精准响应,更是推动信创产业生态建设、填补数据库人才缺…

单链表与单循环链表的C语言实现

单链表与单循环链表的C语言实现 目录单链表与单循环链表的C语言实现单链表的增删查改单循环链表的增删查改 单链表的增删查改 /*单链表*/#include<stdio.h> #include<stdlib.h>typedef struct Node{int data;struct Node* next; }Node;Node* initList(){Node* node…

可能是全球最快捷的修改hosts文件方式

使用快捷方式一键修改hosts文件。 下面请看VCR:其实关键的命令只有一条:powershell.exe -Command "Start-Process -FilePath notepad.exe -Verb RunAs -ArgumentList "$env:SystemRoot\system32\drivers\etc\hosts""它使用记事本以管理员权限打开位于 C:…