首页 > 其他分享 >7.完全二叉树的节点个数

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

时间:2023-12-11 18:45:10浏览次数:32  
标签:return int reCurSion 个数 二叉树 root 节点

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

1、概要

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

示例 1:

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

首先按照普通二叉树的逻辑来求。这道题目的递归法(后序)和求二叉树的深度(取MAX)写法类似, 而迭代法,遍历模板稍稍修改一下,记录遍历的节点数量就可以了

2、思路

普通二叉树

递归法

  • 递归函数参数与返回值
 private int reCurSion(TreeNode root)
  • 终止条件
if(root == null){return 0;}
  • 单层逻辑(累加)
return reCurSion(root.left)+reCurSion(root.right) + 1;

迭代法

加一个变量result,统计节点数量就可以了

在每层的for 增设result++,while循环退出后返回即可

完全二叉树性质

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

image-20231211155941210

完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

  • 情况一:可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

    满二叉树(Full Binary Tree)是一种特殊的二叉树,其中每个节点要么是叶节点(没有子节点),要么有两个子节点。给定满二叉树的高度为h,其节点数量可以用以下公式计算:

    节点数量 = 2^(h+1) - 1

    这个公式可以这样理解:

    1. 在高度为0时(只有一个根节点),节点数量为1,符合公式2^(0+1) - 1 = 1。
    2. 每增加一层高度,节点数量翻倍。例如,高度为1时,节点数量为2;高度为2时,节点数量为4;高度为3时,节点数量为8,以此类推。
    3. 由于满二叉树的特性,每一层的节点数量都是最大可能的,因此总节点数量等于每一层节点数量的总和。通过等比数列求和公式,我们可以得到上述的节点数量公式。

    请注意,这个公式仅适用于满二叉树。对于非满二叉树(如完全二叉树、平衡二叉树等),节点数量的计算方式会有所不同。

  • 情况二:分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算

如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。

在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。不等于则不是满

3、代码

class Solution {
    public int countNodes(TreeNode root) {
        //return reCurSion(root);
        //return iTeRation(root);
        return comPleteBinaryTree(root);
    }

    private int reCurSion(TreeNode root){
        if(root == null){return 0;}

        return reCurSion(root.left)+reCurSion(root.right) + 1;
    }

    private int iTeRation(TreeNode root){
        if(root == null){return 0;}
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        int res = 0;
        while(!que.isEmpty()){
            int deep = que.size();
            for(int i = 0;i<deep;i++){
                TreeNode cur = que.poll();
                res++;
                if(cur.left!=null){que.offer(cur.left);}
                if(cur.right!=null){que.offer(cur.right);}
            }
        }
        return res;
    }

    private int comPleteBinaryTree(TreeNode root){
        if(root==null){return 0;}

        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftDepth = 0,rightDepth=0;
        while(left!=null){
            left = left.left;
            leftDepth++;
        }
        while(right!=null){
            right = right.right;
            rightDepth++;
        }
        //完全二叉树,一定会有左孩子或者右孩子,为满二叉树,可以用公式 2^树深度-1计算
        //左深度等于右深度 ,则说明是满二叉树
        if(leftDepth == rightDepth){
             return (int)Math.pow(2,leftDepth+1) -1;
        //Math.pow 是 Java 中用于计算一个数的指数的函数。它接受两个参数:基数和指数,并返回基数的指数次方的结果。
        //需要注意的是,Math.pow 返回的结果是一个 double 类型,即使输入的参数是整数类型,返回的结果也将是 double 类型。如果需要得到整数类型的结果,可以使用强制类型转换来将其转换为整数类型。 
            
        }
        return comPleteBinaryTree(root.left) + 
            
            comPleteBinaryTree(root.right) +1;
    }
}

标签:return,int,reCurSion,个数,二叉树,root,节点
From: https://www.cnblogs.com/autumnmoonming/p/17895115.html

相关文章

  • 5.二叉树的最大深度
    104.二叉树的最大深度1、概要给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。可以使用前序求深度,也可以使用后序求高度。二叉树节点的深度:指从根节点到该节点的最长简单......
  • C++U5-09-二叉树2
    二叉树(二)二叉树遍历是一种重要的操作,它在许多应用场景中被广泛使用。以下是一些常见的应用场景:查找和搜索:二叉树遍历可以用于查找特定元素或者进行搜索操作。通过遍历整棵树,可以找到目标元素并进行相应的处理。例如,在二叉搜索树中查找某个特定值,或者在字典树中搜索以某个前缀......
  • 各个数据库存二进制大文件的性能测试
    1前言​有个项目软件前端将二进制大文件存在了indexDB,每次给后端传文件(需要传到底层C++进行调用)都会导致内存占用飙升,想着使用前后端都能共同操作的数据库来解决这个内存占用的问题,并且希望这个更具尽可能的轻量,可以嵌入到程序中是最好的,通过一个安装包进行安装。2各个数据......
  • 代码 测试用例 测试结果 测试结果 24. 两两交换链表中的节点
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1] 提示:链表中节点的数目在范围 [0,100] 内......
  • 111. 二叉树的最小深度
    目录题目完美踩坑题解题目给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。示例1:输入:root=[3,9,20,null,null,15,7]输出:2示例2:输入:root=[2,null,3,null,4,null,5,null,6]输出:5完美踩坑之前好几个题做过求树的高......
  • 数据结构--二叉树的生成和遍历(9)
    好久没有更新博客了,关于二叉树也查了不少资料,下面写上我对二叉树的理解。一、什么是二叉树二叉树是一种树形结构,其中每个节点的叶子节点不超过两个,而且二叉树的左右子树是有顺序的,顺序不能颠倒如下图所示,一下四种都属于二叉树。  二、特殊的二叉树1.满二叉树:听名......
  • 【JavaSE】数据结构(树:二叉查找树、平衡二叉树、AVL树、红黑树)
    树度:每个节点的子节点数量树高:树的总层数根节点:入度为0的节点二叉树每个节点最多有两个子节点二叉查找树任意节点左子树上的节点都小于当前节点,右子树上的节点都大于当前节点平衡二叉树任意节点的左右子树的高度差不超过1AVL树AVL树是一种平衡二叉树,得名于其发明者的......
  • 卸载节点Clusterware执行rootcrs.pl时报错"Compilation failed in require..."
    问题描述:卸载节点Clusterware执行rootcrs.pl时报错"Compilationfailedinrequire...",如下所示:系统:rhel7.364位数据库:oracle11.2.0.4rac3节点1、异常重现[root@rac3install]#./rootcrs.pl-deconfig-forceCan'tlocateEnv.pmin@INC(@INCcontains:/usr/local/li......
  • 110. 平衡二叉树
    目录题目自顶向下自顶向下正解自底向上(优)题目给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。自顶向下首先,对当前节点进行处理,计算左孩子的高度,右孩子的高度,两者高度差若大......
  • 函数递归求n个数的最大公因数(优化版)
    #include<stdio.h>intret(intx,inty){  inti=1;  if(x%y==0||y%x==0)   return(x>y?y:x);  else  {    while(x%y!=0)    {      i=x%y;      x=y;     ......