试题 历届真题 完全二叉树的权值【第十届】【省赛】【B组】
#include<bits/stdc++.h>
using namespace std;
int main(){
int N,k=0,num=0,law=1;
cin>>N;
int a[N];
memset(a,0,sizeof(a));
for(int i=0;i<N;i++){//输入结点权值
cin>>a[i];
}
int maxnum=a[0];
for(int i=0;i<N;){
for(int j=0;j<pow(2,k);j++){//按层次结点数遍历
num+=a[i];
i++;
if(i==N) break;//叶子结点单独处理
}
k++;
if(num>maxnum){//若权值大于当前最大值修改最大权值并记录所在层数(这里是相同记录最小,若要记录最大可更改为>=)
maxnum=num;
law=k;
}
num=0;//重新记录下一层的权值
}
cout<<law;
return 0;
}
【知识点:完全二叉树的层次遍历】
单层结点树(2^(k-1))k是所在层数
这里的最后一层要单独考虑,若是满二叉树则不需考虑