hdu5524 Subtrees

http://acm.hdu.edu.cn/showproblem.php?pid=5524
问n个节点的完全二叉树有多少种节点个数不同子树
首先如果是满二叉树好判断,否则,可以把它看成一个完全二叉树和另一个非完全二叉树,如此递归下去,每递归一次,结果加一,因为结点个数肯定和其他的不一样

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include <cmath>
typedef long long ll;

using namespace std;

ll ans,maxn,n;

void find(ll x)
{
    ll l=x,r=x;
    ll dep=0;
    while(l*2<=n)
    {
        l*=2;
        dep++;
    }
    while(r*2+1<=n)
    r=r*2+1;
    if(l<=r) maxn=max(maxn,dep);//满二叉树
    else
    {
        find(2*x);
        find(2*x+1);
        ans++;
    }
}
int main()
{
    while(cin>>n)
    {
        ans=0;
        maxn=0;
        find(1);
        cout<<ans+maxn+1<<endl;
    }
    return 0;
}

    原文作者:B树
    原文地址: https://blog.csdn.net/aonaigayiximasi/article/details/51501634
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞