首页 > 其他分享 >刷刷刷 Day 16 | 222. 完全二叉树的节点个数

刷刷刷 Day 16 | 222. 完全二叉树的节点个数

时间:2023-01-22 22:22:58浏览次数:52  
标签:countNodes 16 个数 222 二叉树 计算 root 节点

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

LeetCode题目要求

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h) 个节点。

示例

图
输入:root = [1,2,3,4,5,6]
输出:6
解题思路
  1. 一种方法是直接计算节点个数,不管它是什么树
  2. 根据完全二叉树的特点来计算节点个数,第一种情况是满二叉树,那么只要知道深度,就可以根据公式 2^depth - 1 计算节点个数了。 第二种情况不是满二叉树,但子树一定存在满二叉树,那么可以先找到满二叉树,计算深度,然后计算其他节点

上代码,通用节点计算

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;
        }

        TreeNode leftNode = root.left;
        TreeNode rightNode = root.right;

        // 定义左右子树深度
        int leftDepth = 0, rightDepth = 0;

        // 计算左子树深度
        while (leftNode != null) {
            leftNode = leftNode.left;
            leftDepth++;
        }

        // 计算右子树深度
        while (rightNode != null) {
            rightNode = rightNode.right;
            rightDepth++;
        }

        // 判断所有子树深度是否一致,如果一致就根据公式计算节点数量
        if (leftDepth == rightDepth) {
            return (2 << leftDepth) - 1;
        }

        // 非满二叉树,计算其他节点数量
        return countNodes(root.left) + countNodes(root.right) + 1;
    } 
}
重难点

本题使用通用解法并使用后序遍历写法很简单。但是根据题目,要分析的完全二叉树的特点,并利用它的特性计算节点数量,可以有效减少计算时间复杂度

附:学习资料链接

标签:countNodes,16,个数,222,二叉树,计算,root,节点
From: https://www.cnblogs.com/blacksonny/p/17064736.html

相关文章

  • ABB 800XA学习笔记35:AC 800M硬件结构16
    这一片学习笔记我在新浪博客发表过,地址是ABB800XA学习笔记35:A800M硬件16_来自金沙江的小鱼_新浪博客(sina.com.cn)在这里我再记录一遍,以免丢失继续学习,AC800M硬件快学习......
  • abc222 F - Expensive Expense
    题意:给定一棵树,边权为路费,点权为观光费。从\(u\)去\(v\)旅游的费用定义为路费加上\(v\)点的观光费求从每个点出发到其它点旅游的最大费用\(n\le2e5\)思路:一眼......
  • 算法编程 dfs 从先序和中序遍历还原二叉树
    105.从前序与中序遍历序列构造二叉树给定两个整数数组 preorder和inorder ,其中 preorder是二叉树的先序遍历,inorder 是同一棵树的中序遍历,请构造二叉树并返回......
  • TS16泛型
    //function(a:any){//returna//}/*定义函数或者类时,如果遇到类型不明确就可以使用泛型*///泛型可以同时指定多个functionfn<T,K>(a:T,b:......
  • 2023-01-16 下高铁一堆人热情迎接 找培民
    2023-01-16周一16号坐高铁回家,下站后外面一片人,都是开小汽车三轮车和摩托车的司机。在拉客,嘴里喊着隆江惠来溪西有无。因为我知道外面有班车能到达我要去的地方所以我......
  • 刷刷刷 Day 16 | 111. 二叉树的最小深度
    111.二叉树的最小深度LeetCode题目要求给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点......
  • 刷刷刷 Day 16 | 104. 二叉树的最大深度
    104.二叉树的最大深度LeetCode题目要求给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节......
  • 刷刷刷 Day | 101. 对称二叉树
    101.对称二叉树LeetCode题目要求给你一个二叉树的根节点root,检查它是否轴对称。示例输入:root=[1,2,2,3,4,4,3]输出:true解题思路通过分别遍历左右两个子树......
  • 刷刷刷 Day 15| 226. 翻转二叉树
    226.翻转二叉树LeetCode题目要求给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点示例输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]解题思路基本......
  • 刷刷刷 Day15 | 102. 二叉树的层序遍历
    102.二叉树的层序遍历LeetCode题目要求给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例输入:root=[3,9,20,null,null,1......