试题 历届真题 完全二叉树的权值【第十届】【省赛】【B组】

 
本题考察到的知识点有:

      在二叉树的第i层上至多有2^(i-1)个节点
      深度为k的二叉树至多有(2^k)-1个节点
      具有n个节点的完全二叉树的深度为[log2n]+1

思路:     

      首先输入n,确定一共有几个节点
      需要设置一个求和的变量,但是取值范围要注意,需要使用 long long int类型
      设置两层循环,最外层是层数,内层为每层的结点数
      每次循环输入一个节点,并加到tol中,每次每层求和完毕,与上层结果比较,如果比上层大,        就标记下来
      循环完成,将标记变量中的值输出即可

代码

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f
typedef long long int LLint;

int main()
{
    int n,x;//输入变量
    int i,j;//循环使用
    int deepNum=0,max=-INF;//运算使用
    int depth=1,length=1;
    LLint tol;
    //输入
    scanf("%d",&n); 
    //计算权值和,层数=log2(n+1)
    for(i=0;i<n;depth++,length*=2)//每一层
    {
        tol=0;//置0
        for(j=0;j<length && i<n;++i,++j)
        {
            scanf("%d",&x);//输入权值
            tol+=x;//每一层的权值和
        }           
        if(tol>max)
        {
            max=tol;
            deepNum=depth;//记录下层号
        }
    }
    //输出
    printf("%d",deepNum);

    return 0;
}

 完全二叉树每层的开头为2^(n-1) 结尾 2^n - 1

代码

//完全二叉树每层的开头为2^(n-1) 结尾 2^n - 1
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    long long maxx=-1e18;
    int depth=1;
    int ans=1;
    for(int i=1;i<=n;i*=2)//头指针
    {
        long long s=0;
        for(int j=i;j<=i*2-1&&j<=n;j++)
        {
            s+=a[j];
        }
        
        
        if(s>maxx)
        {
            ans=depth;
            maxx=s;
        }
        depth++;
    }
    cout<<ans<<endl;
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值