利用树的性质
主要两个点:
最后一层节点可能不是满的,所以需要加上这个判断条件 (i == n-1)
下一层的节点数是上一层的节点数*2,通过判断当前第几个节点是否==该层总结点数,来确定是否到达该层最后一个,若是则需要将当前第几个节点和该层权值和置零,方便下一层计数
import java.util.Scanner;
public class 第十届_完全二叉树的权值 {
static int n;
static int[] tree;
static int sum; // 某深度的最大权值
static int tempSum; // 当前深度所有节点的权值
static int dept; // 存放结果即权值最大的最小深度
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
tree = new int[n];
for(int i = 0; i<n; i++) {
tree[i] = sc.nextInt();
}
/**
* curDept 当前深度
* curDeptCount 当前深度的第几个
* curDeptNum 当前深度总共有几个节点
*/
for(int i = 0, curDept = 1, curDeptCount = 1, curDeptNum = 1; i<n; i++,curDeptCount++) {
if(i == 0) { // 第一层即根节点,直接把权值赋值
sum = tree[i];
dept = curDept;
}
else { // 计算每一层
if(curDeptCount == 1) { // 当前层的第一个,则将深度+1
curDept++;
tempSum += tree[i];
// curDeptCount++;
} else {
tempSum += tree[i];
// curDeptCount++;
}
if(tempSum > sum && i == n-1) { // 如果最后一层不是满的并且该层权值和大于sum,则赋值
sum = tempSum;
// curDeptCount = 0;
// tempSum = 0;
dept = curDept;
}
}
if(curDeptCount == curDeptNum) { // 如果走到该层最后一个
if(tempSum > sum) {
sum = tempSum;
dept = curDept;
}
// 需要将下一层的总节点数算出来
curDeptNum*=2;
// 置零,方便下一层计数
curDeptCount = 0;
tempSum = 0;
}
}
System.out.print(dept);
}
}