**
完全二叉树的权值满分解法
**
一、完整题目
二、解题思路
本题是考察我们对数据结构第五章树的掌握程度的考察,题目不难,应该也算是一道签到题了,考察到的知识点有:
- 在二叉树的第i层上至多有2^(i-1)个节点
- 深度为k的二叉树至多有(2^k)-1个节点
- 具有n个节点的完全二叉树的深度为[log2n]+1
因此,本题的思路也就非常简单了:
- 首先输入n,确定一共有几个节点
- 需要设置一个求和的变量,但是取值范围要注意,需要使用 long long int类型
- 设置两层循环,最外层是层数,内层为每层的结点数
- 每次循环输入一个节点,并加到tol中,每次每层求和完毕,与上层结果比较,如果比上层大,就标记下来
- 循环完成,将标记变量中的值输出即可
话不多说,上代码
三、编写代码
#include <stdio.h>
#include <math.h>
#define INF 0x3f3f3f
typedef long long int LLint;
int main()
{
int n,x;//输入变量
int i,j;//循环使用
int deepNum=0,max=-INF;//运算使用
int depth=1,length=1;
LLint tol;
//输入
scanf("%d",&n);
//计算权值和,层数=log2(n+1)
for(i=0;i<n;depth++,length*=2)//每一层
{
tol=0;//置0
for(j=0;j<length && i<n;++i,++j)
{
scanf("%d",&x);//输入权值
tol+=x;//每一层的权值和
}
if(tol>max)
{
max=tol;
deepNum=depth;//记录下层号
}
}
//输出
printf("%d",deepNum);
return 0;
}
四、测评结果
通过所有的测试点
五、总结评价
虽然是两层循环,但是一共只输入了n个节点值,所以时间复杂度为O(n),可以知道,效率是比较高的。通过此题我们复习了一边完全二叉树的一些知识,这些基础知识是一定需要掌握的,一旦你知道这些知识点,对于解题的帮助是,非常大的。
有问题欢迎各位大佬指出
蓝桥杯系列将持续更新,欢迎关注,一起学习