1. 程式人生 > 其它 >藍橋杯—二叉樹的權值(C語言解法)

藍橋杯—二叉樹的權值(C語言解法)

題目描述

給定一棵包含N 個節點的完全二叉樹,樹上每個節點都有一個權值,按從上到下、從左到右的順序依次是A1, A2,…… AN,如下圖所示:

現在小明要把相同深度的節點的權值加在一起,他想知道哪個深度的節點 權值之和最大?如果有多個深度的權值和同為最大,請你輸出其中最小的深度。
注:根的深度是 1。

輸入描述

第一行包含一個整數 N。
第二行包含 N 個整數 A1, A2, · · · AN 。

輸出描述

輸出一個整數代表答案

輸入輸出樣例

輸入

7
1 6 5 4 3 2 1

輸出

2

思路

  1. 因為是二叉樹,所以每層最大節點數是確定的,i層的最大節點數為 2^(i-1)
  2. 將二叉樹各節點的權值存入陣列中,對該陣列進行遍歷,每層的節點數從1開始,如大於最大節點數,則層數加1(層數初始值為1)
  3. 將根節點作為max的初始值,若某層權值和大於max,則level為該層層數(level為最終結果)
  4. 最後一層要單獨比較,因為最後一層的節點數是小於等於最大值的,層數無法增加,權值和也不能在迴圈中與max比較
  5. 先增加層數,在比較max與上一層權值和原因:count(層級數)的初始值為1,而進入迴圈後是從第二層開始的(max的值設為了根節點的值),所以count落後1,要先加1
#include<stdio.h>
#include<math.h>
int main(){
	int max,num,level=1,count=1,nums=0;
	int snum[100000];
	int i,j=1;
	scanf("%d",&num);
	for(i=0;i<num;i++){
		scanf("%d",&snum[i]);
	}//讀入資料並存儲至陣列
	max=snum[0];
	for(i=1;i<num;i++,j++){//遍歷陣列
		if(j>pow(2.0,count)){//新一層開始
			count++;//層數加1
			if(max<nums){max=nums;level=count;}//比較max與上一層節點和的大小
			j=1;//該層節點數從1開始
			nums=snum[i];//該層權值和為該層第一個節點的值
		}
		else{nums+=snum[i];}//每層除第一個節點之外的節點直接加到該層權值和中
	}
	if(max<nums){max=nums;level=count+1;}//最後一層的權值和
	printf("%d",level);
	return 0;
}