[nowCoder] 完全二叉树结点数

给定一棵完全二叉树的头节点head,返回这棵树的节点个数。如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法。 

 

分析:遍历的话不管是前序、中序、后序还是层次都是O(N),低于O(N)只能是O(lgN),向二分方向努力。

完全二叉树:除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点

 

只有最后一层不满,我们可以根据左子树的最右节点或者右字数的最左节点来判断左子树是不是满二叉树,

若左字树满,可用公式计算左字树的节点数2^(l-1), 总节点数n= 2^(l-1)+ 1(根节点)+递归右子树的节点数。

若左字树不满,可知右子树满,层数为l-2,可用公式计算左字树的节点数2^(l-2), 总节点数n= 2^(l-2)+ 1(根节点)+递归左子树的节点数。

 

判断左子树的最右节点或者右字数的最左节点是否存在可以从层数上来判断。。

 

class Solution {
private:
        int calcHeight(TreeNode *head)
        {  
            int height = 0;
            while(head)
            {  
                head = head->left;
                height ++;
            }  
            return height;
        }  
    public:
        int nodeNum(struct TreeNode* head)
        {  
            if(head == NULL)
                return 0;
 
            int height = calcHeight(head);
            //cout << "height\t" <<height << endl;
 
            if(calcHeight(head->right) == height - 1)//left sub-tree is full
                return (1 << (height - 1) )+ nodeNum(head->right);
            else// right sub-tree is full
                return (1 << (height - 2) )+ nodeNum(head->left);
        }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值