DAY17:二叉树(六)完全二叉树的节点个数,注意深度初值和时间复杂度优化

文章介绍了如何计算完全二叉树的节点个数,包括两种方法:后序遍历递归和利用完全二叉树的特性。重点讨论了位运算在计算满二叉树节点数中的应用,以及二叉树深度的不同定义。同时,对比了不同方法的时间复杂度,指出O(logn×logn)通常优于O(N)。
摘要由CSDN通过智能技术生成

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

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

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
在这里插入图片描述
输入:root = [1,2,3,4,5,6]
输出:6
示例 2:
输入:root = []
输出:0

完全二叉树、完美二叉树和满二叉树

  1. 完美二叉树(Perfect Binary Tree):每一层都是完全填满的,即每一层的所有节点都存在,没有空缺。也就是说,如果树的高度为h,则有2^h - 1个节点。
  2. 满二叉树(Full Binary Tree):每个节点或者有2个子节点(左子节点和右子节点),或者没有子节点(叶子节点)。也就是说,没有只有一个子节点的节点。
  3. 完全二叉树(Complete Binary Tree):除了最底层外,其他各层的节点数都要达到最大,且最底层必须从左到右填入。也就是说,如果在某一层有空缺,那么该空缺必须在该层的最右侧。

(注意满二叉树和完美二叉树并不是一个概念)

普通二叉树的写法

思路

求节点的数量和求高度类似,递归写法依旧是用后序遍历,统计左右子树的节点数量并返回上一层,进行累加。

完整版
  • 每个节点都遍历了一遍,时间复杂度是O(N)
class Solution {
   
public:
    int countNodes(TreeNode* root) {
   
     //终止条件
    if(root==NULL){
   
        return 0;
    }
    
    //后序遍历
    int leftNum = countNodes(root->left);
    int rightNum = countNodes(root->right);
    int Num = 1+leftNum+rightNum;
    
    return Num;


    }
};

完全二叉树的写法

思路

完全二叉树是除了底层节点之外全满,并且底层节点从左到右没有断开的二叉树。

当我们计算满二叉树的时候,节点数量可以直接用公式,假设满二叉树层数为n,那么节点数量就是2^n-1。例如下图中中间的完全二叉树,前三层的节点数量就是2^3-1=7
在这里插入图片描述
因此可以通过完全二叉树除了底层都是满的这一特性来计算节点数。

遍历一个二叉树的子树,其子树如果是满二叉树,可以先得到子树的深度,然后直接2^n-1。

下面问题就是如何判断子树是否是满二叉树,并计算其深度。如果是满二叉树,向左遍历的深度和向右遍历的深度一定是相等的,并且,本题目规定了是一个完全二叉树,因此不存在左右深度相同但是中间存在NULL的情况。如下图所示。
在这里插入图片描述
但是图中的完全二叉

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值