藍橋杯—二叉樹的權值(C語言解法)
阿新 • • 發佈:2022-01-25
題目描述
給定一棵包含N 個節點的完全二叉樹,樹上每個節點都有一個權值,按從上到下、從左到右的順序依次是A1, A2,…… AN,如下圖所示:
現在小明要把相同深度的節點的權值加在一起,他想知道哪個深度的節點 權值之和最大?如果有多個深度的權值和同為最大,請你輸出其中最小的深度。
注:根的深度是 1。
輸入描述
第一行包含一個整數 N。
第二行包含 N 個整數 A1, A2, · · · AN 。
輸出描述
輸出一個整數代表答案
輸入輸出樣例
輸入
7
1 6 5 4 3 2 1
輸出
2
思路
- 因為是二叉樹,所以每層最大節點數是確定的,i層的最大節點數為 2^(i-1)
- 將二叉樹各節點的權值存入陣列中,對該陣列進行遍歷,每層的節點數從1開始,如大於最大節點數,則層數加1(層數初始值為1)
- 將根節點作為max的初始值,若某層權值和大於max,則level為該層層數(level為最終結果)
- 最後一層要單獨比較,因為最後一層的節點數是小於等於最大值的,層數無法增加,權值和也不能在迴圈中與max比較
- 先增加層數,在比較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; }