完全二叉树的权值
给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是 A1,A2,⋅⋅⋅AN,如下图所示:
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?
如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
样例
7
1 6 5 4 3 2 1
输出样例
2
完全二叉树定义
若设二叉树的深度为h,除第 h层外,其它各层(1-h-1)的结点数都达到最大个数,第h层所有的结点都连续集中在最左这就是完全二叉树。
思路
双指针
第一个指针循环每一层的起点与层数(层数从1开始) 起点的计算方法为2i
第二个指循环每层内的的数 一层有2^(d-1)
最后一层可能不满 需要特殊判断一下 j <= 0 不能越界
代码
n = int(input())
a = list(map(int, input().split()))
ans = []
maxv = -1e18
frist = 1
num1 = 1
dep = 0
while frist <= n:
sum1 = 0
for i in range(frist - 1, frist * 2 - 1):
if i < n:
sum1 += a[i]
ans.append(sum1)
frist = 2 * frist
num1 = 2 * num1
for i in range(len(ans)):
maxv = max(ans[i], maxv)
if maxv == ans[i]:
dep = i + 1
print(dep)