本题考察到的知识点有:
在二叉树的第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;
}