首页 > 其他分享 >代码随想录Day22

代码随想录Day22

时间:2022-11-11 01:00:34浏览次数:48  
标签:return int 代码 随想录 Day22 queue 二叉树 countNodes root

LeetCode222. 完全二叉树的节点个数

 

给出一个完全二叉树,求出该树的节点个数。

示例 1:

  • 输入:root = [1,2,3,4,5,6]
  • 输出:6

示例 2:

  • 输入:root = []
  • 输出:0

示例 3:

  • 输入:root = [1]
  • 输出:1

提示:

  • 树中节点的数目范围是[0, 5 * 10^4]
  • 0 <= Node.val <= 5 * 10^4
  • 题目数据保证输入的树是 完全二叉树

 

思路:

首先是完全二叉树的定义

 

思路:题目明确表明是一颗完全二叉树。我们可以根据公式求满二叉树的节点个数。

接下来,只要判断完全二叉树的左右子树是否是满二叉树,然后每一层返回深度就可以了。

对于不是满二叉树的情况再进行单独的处理。

class Solution {
    // 通用递归解法
    public int countNodes(TreeNode root) {
        if(root == null) {
            return 0;
        }
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}

class Solution {
    // 迭代法
    public int countNodes(TreeNode root) {
        if (root == null) return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int result = 0;
        while (!queue.isEmpty()) {
            int size = queue.size();
            while (size -- > 0) {
                TreeNode cur = queue.poll();
                result++;
                if (cur.left != null) queue.offer(cur.left);
                if (cur.right != null) queue.offer(cur.right);
            }
        }
        return result;
    }
}

class Solution {
    /**
     * 针对完全二叉树的解法
     *
     * 满二叉树的结点数为:2^depth - 1
     */
    public int countNodes(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int leftDepth = getDepth(root.left);
        int rightDepth = getDepth(root.right);
        if (leftDepth == rightDepth) {// 左子树是满二叉树
            // 2^leftDepth其实是 (2^leftDepth - 1) + 1 ,左子树 + 根结点
            return (1 << leftDepth) + countNodes(root.right);
        } else {// 右子树是满二叉树
            return (1 << rightDepth) + countNodes(root.left);
        }
    }

    private int getDepth(TreeNode root) {
        int depth = 0;
        while (root != null) {
            root = root.left;
            depth++;
        }
        return depth;
    }
}

 

标签:return,int,代码,随想录,Day22,queue,二叉树,countNodes,root
From: https://www.cnblogs.com/dwj-ngu/p/16879352.html

相关文章

  • 拓端数据|R语言代写阈值模型代码示例
    阈值模型用于统计的几个不同区域,而不仅仅是时间序列。一般的想法是,当变量的值超过某个阈值时,过程可能表现不同。也就是说,当值大于阈值时,可以应用不同的模型,而不是当它们低于......
  • 基于改进神经网络的风电功率预测(Matlab代码实现)
    ......
  • 1.jupyter 的代码自动补全插件安装
    1.使用pip安装jupyter拓展包,本人选择在cmd中安装pipinstalljupyter_contrib_nbextensions2.配置nbextension,前提是先关闭jupyternotebookjupytercontribnbextensi......
  • 解决合并分支代码冲突
    1,当执行gitmerge合并代码报冲突的时候首先看到是哪个文件,在vscode里面打开,留下想要的那行代码2,修改完之后在当前的分支上进行add,commit,push这些操作3,gitmerge需要合......
  • Java反射和代码
    反射什么是反射Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到类对象之后,再通过类对象进行反编译,从而获取......
  • 测试遇到的代码(python)
    目录:   第一部分:1、SSTI类型importflaskimportosapp=flask.Flask(__name__)app.config['FLAG']=os.environ.pop('FLAG')@app.route('/')definde......
  • 收集篇 之 那些好玩又实用 JS 工具代码段(不断更新 ing)
    LZ-Says:上班的时间过的真快,如何把握、如何更好的利用现有时间,是个问题,But,Justdoit前言Android小白,转战各个平台,虽说被虐,But,乐在其中。原谅我爱Android爱的如此深沉~......
  • Android代码规范利器: Checkstyle
    程序代码向来都不仅仅是用来运行的,写的一手好代码,易读,可维护应该是每个程序员所追求的。每个团队都(应该)有一套优良统一的代码规范,而规范的检查依赖于人工检测就不太现实,好在......
  • 网络社群发现算法挖掘bilibili视频流量数据可视化|附代码数据
    全文链接:http://tecdat.cn/?p=19006最新研究表明,中国有超过7亿人在观看在线视频内容。Bilibili,被称为哔哩哔哩或简称为B站,是中国大陆第二个弹幕视频网站,最大的年轻人潮流......
  • R语言中的SOM(自组织映射神经网络)对NBA球员聚类分析|附代码数据
    原文链接:http://tecdat.cn/?p=19077自组织映射 (SOM)是一种工具,通过生成二维表示来可视化高维数据中的模式,在高维结构中显示有意义的模式 ( 点击文末“阅读原文”获取完整......