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

leetcode 958. Check Completeness of a Binary Tree 判断是否是完全二叉树 、222. Count Complete Tree Nodes...

完全二叉树的定义:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

解题思路:将树按照层进行遍历,如果出现null后还出现非null则能证明这个不是完全二叉树

https://leetcode.com/problems/check-completeness-of-a-binary-tree/discuss/205768/Java-easy-Level-Order-Traversal-one-while-loop

class Solution {
public:
    bool isCompleteTree(TreeNode* root) {
        bool end = false;
        if(root == NULL)
            return true;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()){
            TreeNode* node = q.front();
            q.pop();
            if(node == NULL)
                end = true;
            else{
                if(end)
                    return false;
                q.push(node->left);
                q.push(node->right);
            }
        }
        return true;
    }
};

 

 222. Count Complete Tree Nodes

这题是计算完全二叉树有多少个节点,按照层序遍历,找到第一个为空的节点就停止计算就好了。

注意:将node = q.front()放在循环的末尾,不放在一开始。因为每一次while都需要判断node是否为空,如果放在开始,后面的push操作就会写很多冗余的代码。同时,放在后面的话,也要在循环

           外就进行初始化

  

class Solution {
public:
    int countNodes(TreeNode* root) {
        int count = 0;
        queue<TreeNode*> q;
        q.push(root);
        TreeNode* node = root;
        while(node != NULL){
            q.pop();
            count++;
            q.push(node->left);
            q.push(node->right);
            node = q.front();
        }
        return count;
    }
};

 

另一种写法,自己的:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        if(!root)
            return 0;
        queue<TreeNode*> q;
        q.push(root);
        int count = 0;
        while(!q.empty()){
            TreeNode* tmp = q.top();
            if(!tmp)
                break;
            count++;
            q.pop();
            q.push(tmp->left);
            q.push(tmp->right);
        }
        return count;
    }
};

 

转载于:https://www.cnblogs.com/ymjyqsx/p/10671067.html

相关文章:

  • 力扣——二叉树的层次遍历
  • vue工程 使用滚动组件 vue2-better-scroll 实现上拉加载 下拉刷新
  • Python多线程实例
  • loadrunner中web_reg_save_param和web_reg_save_param_ex的区别
  • 理解JavaScript【转】
  • python入门 第一节
  • 1255: 打怪升级(Java)
  • 随笔2
  • JavaSE--日志
  • 大二下周总结(7)
  • 前段支持
  • 二:Nexus知识
  • python-for显示奇偶数
  • 力扣——用栈实现队列
  • 02 Anaconda的介绍,安装记以及使用
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [译]如何构建服务器端web组件,为何要构建?
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 78. Subsets
  • android图片蒙层
  • Fastjson的基本使用方法大全
  • Hexo+码云+git快速搭建免费的静态Blog
  • iOS 系统授权开发
  • JavaScript DOM 10 - 滚动
  • Map集合、散列表、红黑树介绍
  • mongo索引构建
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • 关于extract.autodesk.io的一些说明
  • 关于字符编码你应该知道的事情
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 如何在 Tornado 中实现 Middleware
  • 通过几道题目学习二叉搜索树
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 怎样选择前端框架
  • 白色的风信子
  • Nginx实现动静分离
  • puppet连载22:define用法
  • ​你们这样子,耽误我的工作进度怎么办?
  • #if 1...#endif
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (2015)JS ES6 必知的十个 特性
  • (C++)八皇后问题
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (未解决)macOS matplotlib 中文是方框
  • (一)u-boot-nand.bin的下载
  • (译)计算距离、方位和更多经纬度之间的点
  • (原)本想说脏话,奈何已放下
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)IOS中获取各种文件的目录路径的方法