藍橋杯 - 小球下落 二叉樹順序存儲運用 C語言實現

小球下落

有一棵二叉樹,最大深度爲D,且所有葉子的深度都相同。所有結點從上到下從左到右編號爲1,2,3,...,2^D-1。在結點1處放一個小球,它會往下落。每個內結點上都有一個開關,初始全部關閉,當每次有小球落到一個開關上時,它的狀態都會改變。當小球到達一個內結點時,如果該結點上的開關關閉,則往左走,否者往右走,直到走到葉子結點。
一些小球從結點1處依次開始下落,最後一個小球將會落到哪裏呢?輸入葉子深度D和小球個數I,輸出第I個小球最後所在的葉子編號。假設I不超過整棵樹的葉子個數(即2^(D-1))。D<=20。輸入最多包含1000組數據。
樣例輸入:
4 2
3 4
10 1
2 2
8 128
16 12345
樣例輸出:
12
7
512
3
255
36358

分析:
二叉樹的練習題,首先需要熟悉二叉樹的基本性質,二叉樹的順序存儲和鏈式存儲(這裏用到順序存儲)。

代碼在此:
#include<stdio.h>
#include<string.h>
#include<math.h>

#define SIZE 1000

typedef struct node{
	int data;
	int type;
}Node;

Node a[SIZE];

int main () {
	
	int D, I;
	int i, j;
	
//	scanf("%d%d", &D, &I);
	D = 4;
	I = 2;
	
	memset(a, 0, sizeof(a));
	
	int len = (int)pow(2,D) - 1;	//深度爲k的樹至多有2^k-1個節點 
	for(i = 1; i <= len; i ++){
		a[i].data = i;
	}

	int k;
	for(i = 0; i < I; i ++){	//I個小球循環 
		k = 1;
		for(j = 0; j < D-1; j ++){	//深度爲D的數需要移動D-1次 
			if(a[k].type == 0){
				a[k].type = 1;
				k = 2 * k;
			} else {
				a[k].type = 0;
				k = 2 * k + 1;
			}
		}
	}
	
	printf("%d", k);
	
	return 0;
} 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章