题目:
给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是 A1, A2, ··· AN,如下图所示:
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
【输入格式】
第一行包含一个整数 N。
第二行包含 N 个整数 A1, A2, ··· AN 。
【输出格式】
输出一个整数代表答案。
【样例输入】
7
1 6 5 4 3 2 1
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例,1≤ N ≤100000,−100000≤ Ai ≤100000。
分析:
这道题我做完的时候只得了80分,一直不知道错在哪,直到今天才发现我考虑的是满二叉树的情况,而这道题让我们求得是完全二叉树的权值。
完全二叉树的特点是:最后一层可能没有满,所以我们需要设置一个bool变量来判断最后一行有没有满。
考虑成满二叉树时的代码(错误代码):
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int N;
cin >> N;
int k;
long long max_sum = -100000;
long long sum = 0;
int small_deep = 1;
int deep = 1;
for(int i = 1;i <= N;i++){
cin >> k;
sum += k;
if(i == pow(2,deep)-1){//每一层的节点权值全部加起来后进行判断
if(sum > max_sum){
max_sum = sum;
small_deep = deep;
}
deep++;
sum = 0;
}
}
cout << small_deep;
return 0;
}
正确代码:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int N;
cin >> N;
int k;
long long max_sum = -100000;
long long sum = 0;
int small_deep = 1;
int deep = 1;
bool isfullTree;
for(int i = 1;i <= N;i++){
cin >> k;
sum += k;
isfullTree = false;
if(i == pow(2,deep)-1){//每一层的节点权值全部加起来后进行判断
if(sum > max_sum){
max_sum = sum;
small_deep = deep;
}
deep++;
sum = 0;
isfullTree = true;
}
}
if(!isfullTree && sum > max_sum){//最后一层若没有满需要单独判断
max_sum = sum;
small_deep = deep;
}
cout << small_deep;
return 0;
}