在未接触过二叉树类型的题目之前,我对二叉树几乎毫无所知,经过这道题,我get it!!!!!
说一下做这道题之前我的思路吧
首先,我想的是先用一个数组将所有的数据存储起来,然后因为二叉树每一行,都是上一行数据个数的2倍(成规律增长),那么我就想再来一个数组作为一个表格存储每一行数据的叠加,最后在这个表格里面找到最大的那个数字并且输出那是哪一行(深度)即可!!!!!!!!!!!!
#include<stdio.h>
#include<cmath>
#include<cstring>
int minn =-100001;
int main()
{
int n,m=1,i,min;
scanf("%d",&n);
int num[n];
long long sum[n];
memset(sum,0,sizeof(sum));
for( i=1;i<=n;i++)
{
scanf("%d",&num[i]);
if(i>=pow(2,m-1)&&i<pow(2,m))
{
sum[m]+=num[i];
}
if((i+1)==pow(2,m))
m++;
}
for( i=1;i<m;i++)
{
if(sum[i]>minn)
{
minn=sum[i];
min=i;
}
}
printf("%d",min);
return 0;
}
然而,想法很美好,现实很骨感,提交后只能得到80分,估计是有两个样例数据比较大吧~~~~~
下面是正确的二叉树打开方式:
//完全二叉树每层的开头为2^(n-1) 结尾 2^n - 1 (n是深度)
#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)//头指针 这里的i 相当于2^(n-1) (n是深度)
{
long long s=0;
for(int j=i;j<=i*2-1&&j<=n;j++) //2*i-1= 2^(n-1) *2 -1 = 2^n - 1
{
s+=a[j];
}
if(s>maxx)
{
ans=depth;
maxx=s;
}
depth++;
}
cout<<ans<<endl;
return 0;
}
值得注意的是这里面使用的嵌套循环条件!!!!!!!!!!!!!!!!!!!!!!!!!