leetcode:count the number of nodes

本文介绍了一种高效计算完全二叉树中节点数量的方法。通过递归地确定二叉树的高度,并根据左右子树的高度来判断节点的数量,从而避免了遍历每个节点的开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a complete binary tree, count the number of nodes.

Definition of a complete binary tree from Wikipedia:
In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.

Subscribe to see which companies asked this question


/**
 * 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 {
    
private:
    int countNodesHelper(TreeNode* root, int curLevel, int treeHight) {
        
        if (curLevel == treeHight)
            return 1;
            
        int righTreeMostLevel = (root->right != NULL)? leftMostLevel(root->right, curLevel+1) : curLevel;
            
        if (righTreeMostLevel == treeHight)//如果右子树的最左子树能到达全树的高度
        {
            //则,左子树就是一颗满的二叉树,并且左子树的高度为treeHight-curLevel, 节点数目为 2e(treeHight-curLevel)-1; 再加上root节点, 数目为 2e(treeHight-curLevel)
            return (1 << (treeHight-curLevel)) + countNodesHelper(root->right, curLevel+1, treeHight);
        }
        else // 如果右子树的最左子树不能达到全树的高度,
        {
            //则,右子树一定是一个满的二叉树,并且右子树的高度为 treeHight-curLevel-1, 节点数目为2e(treeHight-curLevel-1)-1,
            //再加上root节点,数目为2e(treeHight-curLevel-1)
            return (1 << (treeHight-curLevel-1) + countNodesHelper(root->left, curLevel+1, treeHight));
        }
    }


    int leftMostLevel(TreeNode* root, int level) {
        
        TreeNode* curNode = root;
        int curLevel = level;
        while (curNode->left)
        {
            curLevel++;
            curNode = curNode->left;
        }
        
        return curLevel;
        
    }

    int TreeHight(TreeNode *root) {
        
        if (root == NULL)
            return 0;
            
        int leftHight = TreeHight(root->left);
        int rightHight = TreeHight(root->right);
        
        return max(leftHight, rightHight)+1;
    }
    
    int fTreeHt(TreeNode *root){ //get the height of a complete binary tree.
            if(!root) return 0;
            return 1+fTreeHt(root->left);
        }
    
public:
    int countNodes(TreeNode* root) {
            if(!root) return 0;
            //要获取左右子树的高度
            int lh=fTreeHt(root->left);
            int rh=fTreeHt(root->right);     
            if(lh==rh) 
               return (1<<lh)+countNodes(root->right);  /*1(根节点) + (1<<lh)-1(完全左子树) + # of rightNode */               
            else 
               return (1<<rh)+countNodes(root->left);  /*1(根节点) + (1<<rh)-1(完全右子树) + # of leftNode*/
        }
    /*
    int countNodes(TreeNode* root) {
        
        if (root == NULL)
            return 0;
            
        int h = TreeHight(root);
        return countNodesHelper(root, 1, h);
    }
    */
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值