题目描述
给定一棵包含 NN 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A_1, A_2, ··· A_NA1,A2,⋅⋅⋅AN,如下图所示:
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
输入描述
第一行包含一个整数 N(1 \leq N \leq 10^5)N(1≤N≤105)。
第二行包含 NN 个整数 A_1, A_2, ··· A_N (−10^5 \leq A_i \leq 10^5)A1,A2,⋅⋅⋅AN(−105≤Ai≤105)。
输出描述
输出一个整数代表答案。
输入输出样例
示例
输入
7
1 6 5 4 3 2 1
输出
2
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
代码
import math
class Tree:
num = 0
max_num=0
def __init__(self, data=None, left=None, right=None,):
self.data = data
self.left = left
self.right = right
Tree.num = Tree.num + 1
self.gen = int(Tree.num)
if Tree.max_num<Tree.num:
Tree.max_num=Tree.num
def postorder(self):
if self.left is not None:
self.left.postorder()
if self.right is not None:
self.right.postorder()
if self.data is not None:
print(self.data, end='')
def bfs(self):
if self is None:
return
queue = [self]
queue2=[]
while queue:
cur = queue.pop(0) # 弹出元素
# print(str(cur.data)+'('+str(cur.gen)+')', end=' ') # 打印元素值
queue2.append(cur)
if cur.left is not None:
queue.append(cur.left)
if cur.right is not None:
queue.append(cur.right)
return queue2
def add_data(self, data):
if self.data is None:
self.data = data
return
newnode = Tree(data)
queue = [self]
while queue:
node = queue.pop(0)
if node.left is None:
node.left = newnode
# print(node.data+'的左子树是'+newnode.data)
return
else:
queue.append(node.left)
if node.right is None:
node.right = newnode
# print(node.data+'的右子树是'+newnode.data)
return
else:
queue.append(node.right)
if __name__ == '__main__':
N = int(input())
data = list(map(int, input().split()))
# print(data)
tree = Tree()
for i in data:
tree.add_data(i)
queue=tree.bfs()
depth=int(math.log(N+1,2))
sum=[]
su=0
for i in range(depth):
for j in range(pow(2,i)):
su=su+queue.pop(0).data
sum.append(su)
su=0
print(sum.index(max(sum))+1)