R7-1 完全二叉树的权值
作者 y 单位 成都锦城学院
给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序为A1,A2,A3⋅⋅⋅AN
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
输入格式:
第一行包含一个整数N(1 ≤ N ≤ 100000)
第二行包含 N个整数,A1,A2,A3⋅⋅⋅AN(-100000 ≤ Ai ≤ 100000)
输出格式:
输出一个整数代表答案,结尾无空格换行。
输入样例:
在这里给出一组输入。例如:
7
1 6 5 4 3 2 1
输出样例:
在这里给出相应的输出。例如:
2
题目来源:蓝桥杯省赛真题
代码长度限制 16 KB
时间限制 1000 ms
内存限制 128 MB
思路:
目标树为完全二叉树,非根节点的父节点的位置为: (向下取整)
可以用一维数组来直接存储目标树。
(设层数为n) 先用 来求出 该树的层数;
然后求出每一层的节点个数:(第i层),
接着求出每层 节点的权值 ;
最后求出并输出节点最大权值所在的深度。
代码实现:
#include<iostream>
using namespace std;
int main()
{
int Numb[100000], n, Leval[100000], Sum[1000] = {0};
cin >> n;
for (int i = 1; i <= n; i++)
cin >> Numb[i];
int leveal = n / 2;
for (int i = 1; i <= leveal; i++)
Leval[i] = pow(2, i - 1);//获取每层元素结点数
for (int i = leveal; i > 0; i--)//每i层的权值
for (int a = Leval[i]; a >0; a--)
Sum[i] += Numb[n--];//第i层权值,从数组后面加起
int max = 0,position = 0;
for (int i = leveal; i > 0; i--)
if (max < Sum[i])
{
max = Sum[i];
position = i;
}
cout << position;
return 0;
}
若路过的大佬们,有更好方法
欢迎指出哇!!!