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

本文介绍两种方法计算完全二叉树的节点数量:递归法和利用完全二叉树特性减少递归深度的方法。前者简单直接,后者通过比较左右子树高度,判断左子树是否满来提高效率。

题目

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

说明:

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

示例:

输入:

    1
   / \
  2   3
 / \  /
4  5 6

输出: 6


思路一:递归

左子树的个数加右子树的个数加1

/**
 * 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;
        return countNodes(root->left)+countNodes(root->right)+1;
    }
};

思路二

利用完全二叉树节点数: 2 h − 1 {2^h-1} 2h1,h是二叉树高度,降低递归复杂度
比较右子树与树的高度,如果相差1,则说明左子树是满二叉树,总节点数 = 左子树节点数( 2 h − 1 − 1 {2^{h-1}-1} 2h11)+ 根节点(1)+右子树节点数(递归计算)
如果相差2,说明左子树未满,总节点数 = 右子树节点数( 2 h − 2 − 1 {2^{h-2}-1} 2h21)+根节点(1)+左子树节点数(递归计算)。
代码如下:

/**
 * 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 getHeight(TreeNode* root){
        int height = 0;
        while(root){
            height++;
            root = root->left;
        }
        return height;
    }
    int countNodes(TreeNode* root) {
        if(!root)
            return 0;
        int height = getHeight(root);
        int rightHeight = getHeight(root->right);
        if(height == rightHeight + 1) //左子树已满
            return (1 << height-1) + countNodes(root->right); //左子树节点数加右子树节点数
        else
            return countNodes(root->left) + (1 << height-2); //左子树节点数加右子树节点数
        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值