当前位置: 首页 > news >正文

【打卡】牛客网:BM35 判断是不是完全二叉树

自己写的:

第一行到倒数第三行都是满的,最后判断倒数第二行的情况。

但是,第一个while循环,考虑迭代的停止条件时,如果是根据节点个数进行判断,那么计算98层节点个数的时候,n的存储范围不够。所以改成根据层数进行判断。

/*** struct TreeNode {*  int val;*  struct TreeNode *left;*  struct TreeNode *right;*  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/
class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param root TreeNode类* @return bool布尔型*/int maxDepth(TreeNode* root) {if (root == NULL)return 0;return max(maxDepth(root->left), maxDepth(root->right)) + 1;}bool isCompleteTree(TreeNode* root) {// write code hereint h = maxDepth(root);if(h == 1)return true;if(h == 2)if(root->left == NULL && root->right != NULL)return false;elsereturn true;int hCur = 1;queue<TreeNode*> q;q.push(root);// 第一层到倒数第三层while(hCur != h) {hCur ++;if (q.front()->left == NULL || q.front()->right == NULL)return false;q.push(q.front()->left);q.push(q.front()->right);q.pop();}// 倒数第二层while (!q.empty()) {if (q.front()->right == NULL) {q.pop();while (!q.empty()) {if (q.front()->left != NULL && q.front()->right != NULL)return false;q.pop();}} else {if (q.front()->left == NULL)return false;elseq.pop();}}return true;}
};

模板的:

①因为完全二叉树,只有最后一行可能出现NULL,所以在层序遍历的时候,不需要考虑子节点是否为空。(以前的做法是,分别判断左右子节点:如果不为空,再push进去。)

②基于①,所以层序遍历不需要考虑“某一个节点的左右子节点为NULL”的相互关系。只需要按照完全二叉树的定义来思考,即完全二叉树的所有元素是紧凑的:靠上的,最后才是靠左的。如果从上往下,再从左往右遍历。那么出现NULL后,再出现一个值,那么最终判断结果一定是false。

/*** struct TreeNode {*  int val;*  struct TreeNode *left;*  struct TreeNode *right;*  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/
class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param root TreeNode类* @return bool布尔型*/bool isCompleteTree(TreeNode* root) {// write code hereif(root == NULL)return true;queue<TreeNode*> q;q.push(root);int flag = 0;while(!q.empty()) {for(int i = 0; i < q.size(); i++){TreeNode* cur = q.front();q.pop();if(!cur) // 第二次出错了,if(cur==NULL)是if(!cur),不是if(cur)!!!flag = 1;else{if(flag)return false;q.push(cur->left);q.push(cur->right);}}}return true;}
};

相关文章:

  • vue的指令学习
  • 一座 “数智桥梁”,华为助力“天堑变通途”
  • golang工程——中间件redis,单节点集群部署
  • vue双向绑定失效,设置data值页面却不显示
  • 线性代数 第六章 二次型
  • 【代码数据】2023粤港澳大湾区金融数学建模B题分享
  • Centos部署清华ChatGLM3-6B详细教程
  • ffmpeg mp3截取命令,视频与mp3合成带音频视频命令
  • 【flink】RowData copy/clone方式
  • 动态规划29(Leetcode714买卖股票的最佳时期含手续费)
  • Go语言并发控制:原理与实践
  • 解决 eslint 的 Parsing error: Unexpected token 错误
  • 抛弃繁琐、提高效率:低代码工具助你飞速开发 | 开源专题 No.42
  • 3.4_Linux-浏览文件系统
  • Opencv实现的三次样条曲线(Cubic Spline)插值
  • 【Leetcode】101. 对称二叉树
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Angularjs之国际化
  • Debian下无root权限使用Python访问Oracle
  • javascript面向对象之创建对象
  • Node + FFmpeg 实现Canvas动画导出视频
  • SAP云平台里Global Account和Sub Account的关系
  • socket.io+express实现聊天室的思考(三)
  • vue-router的history模式发布配置
  • 仿天猫超市收藏抛物线动画工具库
  • 回顾 Swift 多平台移植进度 #2
  • 开源地图数据可视化库——mapnik
  • 码农张的Bug人生 - 见面之礼
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 用 Swift 编写面向协议的视图
  • 用mpvue开发微信小程序
  • 阿里云服务器如何修改远程端口?
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #WEB前端(HTML属性)
  • #大学#套接字
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (02)Hive SQL编译成MapReduce任务的过程
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (力扣)1314.矩阵区域和
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .net Stream篇(六)
  • .NET 命令行参数包含应用程序路径吗?
  • .net 提取注释生成API文档 帮助文档
  • .Net环境下的缓存技术介绍
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @Async注解的坑,小心
  • [ NOI 2001 ] 食物链
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [AIGC 大数据基础]hive浅谈
  • [bzoj1912]异象石(set)