题目描述
给定一棵包含 NN 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A_1, A_2, ··· A_N。现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
输入描述
第一行包含一个整数 N(1≤N≤105)。
第二行包含 N 个整数 A_1, A_2, ··· A_N (−105 ≤A_i≤ 105)
输出描述
输出一个整数代表答案。
解题过程
先求出树的深度。然后遍历每一层。
由于完全二叉树的特殊性质:树中除了最后一层可能不满,其他层都是满节点状态。所以我们可以通过计算出该层遍历的个数来控制遍历的过程。
Java代码
//记得改类名
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 给定一棵包含 NN 个节点的完全二叉树,树上每个节点都有一个权值,
* 按从 上到下、从左到右的顺序依次是 A_1, A_2, ··· A_N
* 现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?
* 如果有多个深度的权值和同为最大,请你输出其中最小的深度。
* 注:根的深度是 1。
* @author IH
*
*/
public class TwoChaTree {
static int[] g;
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] str = new String[1];
str[0] = reader.readLine();
int n = Integer.parseInt(str[0]);
str = reader.readLine().split(" ");
g = new int[n+1];
for(int i=0;i<n;i++){
g[i] = Integer.parseInt(str[i]);
}
int res = 0;
//计算树的深度
int k = (int)(Math.log(n) / Math.log(2)) + 1;
//遍历到cnt个
int cnt = 0;
//该层能遍历的个数
int r = 1;
//记录每层权总和
int maxd = 0;
//标记最大权值的深度
int ans = 1;
for(int i=1;i<=k;i++){
maxd = 0;
while(cnt < r && cnt < n){
maxd += g[cnt];
cnt ++;
}
if(maxd > res){
res = maxd;
ans = i;
}
r = 2*r + 1;
}
System.out.println(ans);
}
}