题目:
给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A1, A2, ··· AN ,如下图所示:
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
输入描述
输出描述
输出一个整数代表答案。
示例
7
1 6 5 4 3 2 1
结果
2
思路:
本题需要了解完全二叉树的特性,完全二叉树的第 ii层的最大节点数为 2^(i+1) 个,由于我们知道每一层的节点个数,可以直接输入数据后按层统计,甚至都可以不用数组把这些数字存下来。所以只要记录好读入的数字个数,在合适的时间退出循环就行。
本题有两点需要注意:
1.最后一层可能不是满二叉树。
2.2^16 = 65536 ,最多的一层可能有100000-65536 ≈35000个结点,所以要用long防止int溢出
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N;
N = scanner.nextInt();
int cnt = 0; // 统计项数之和
long maxSum = -2000000l; // 最大数之和
int maxLayer = 1; // 最大数的层数
int flag = 0; // 终止循环
// 每一层的遍历
for(int i=1; ;i++)
{
double curNum = Math.pow(2, i-1); // 当前这层最大结点数
long sum = 0;
// 输入每一层的数值 -100000~100000
for(int j=1;j<=curNum;j++)
{
long num = scanner.nextLong();
sum = sum+num;
cnt +=1;
if(cnt==N) {
flag = 1;
break;
}
}
if(sum>maxSum)
{
maxLayer = i;
maxSum = sum;
}
if(flag==1) break;
}
System.out.println(maxLayer);
}
}