题目描述
给定一棵包含N 个节点的完全二叉树,树上每个节点都有一个权值,按从
上到下、从左到右的顺序依次是A1, A2, AN,如下图所示:
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点
权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是1。
我做题时候的误区,是当成了满二叉树来算了,忘了判断最后一层深度是否读取结束。本题是完全二叉树。
另外,节点权值有可能为负数,故max初始值不能设置为0,应为data[0]
import java.util.Scanner;
public class Main {
static int n;
static int []data;//存完全二叉树的数值;
static Scanner cin = new Scanner(System.in);
public static void main(String[] args) {
// TODO 自动生成的方法存根
n=cin.nextInt();
data = new int [n];
for(int i=0;i<n;i++) {
data[i] = cin.nextInt();
}
int temp=1;
int max=data[0];
//i表示层数,j表示各节点数
//j<n时,结束深度的遍历
for(int i=1,j=0;j<n;i++) {
int sum=0;
//注意,这里要判断是否读取完毕数组中的数字,即j<n
//因为是完全二叉树,最后一层不一定是满的
for(;j<get_cifang(2, i)-1&&j<n;j++) {
sum+=data[j];
}
if (max<sum) {
max=sum;
temp=i;
}
}
System.out.println(temp);
}
//快速幂
static int get_cifang(int a,int b) {
int sum=1;
while (b>0) {
if (b%2==1) {
b--;
sum*=a;
}
b=b/2;
a=a*a;
}
return sum;
}
}