1457: [蓝桥杯2019初赛]完全二叉树的权值

题目描述

给定一棵包含N 个节点的完全二叉树,树上每个节点都有一个权值,按从
上到下、从左到右的顺序依次是A1, A2, AN,如下图所示:

现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点
权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是1。

题目坑点

1、完全二叉树不一定是满二叉树
2、初始权值和不能设为0,因为权值和可以为负数
3、int 超限,用long long

源代码

#include
using namespace std;
//快速幂(对半折分,奇数时底数的乘积) 
int fast(int base,int power){
     
	int result=1;
	 while(power>0){
     
	 	if(power%2==1){
     
	 		power--;
	 		result=base*result;
		 }
		 power=power/2;
		 base=base*base;
	 }
	 return result;
 
} 
//完全二叉树不一定是满二叉树,题图是个迷惑点 
//!!!!注意权值之和超过int的范围,所以用long long,即max和sum
//!!!!由于权值可以取负数,所以初始权值也可以为负数,所以初始max不能为0
//!!!!!max的初始化为h=1时的值 
int main(){
     
	int n;
	cin>>n;
	int h=1;
	int a;
	long long sum;///!!!! 
	long long max;//!!!! 
	int re=1;
	while(n>0){
     
			sum=0;
		for(int i=1;i<=fast(2,h-1);i++){
     
			cin>>a;
			n--;
			sum+=a;	
			//输入完毕跳出 
			if(n<=0){
     
				break;
			} 
		}
		if(h==1){
     
			max=sum;
		}
		if(sum>max){
     
			re=h;
			max=sum;
		}
		h++;
	}
	cout<<re<<endl; 

	return 0;
} 

你可能感兴趣的:(快速幂,二叉树)