1. 程式人生 > >二叉樹的編號優化--小球下落

二叉樹的編號優化--小球下落

上一篇的程式碼中由於2^maxn太大,陣列可能會出界導致running error,我們可以設計一個與小球的編號無關的程式,這樣就可以節省了一個巨大的a陣列。

參考:演算法競賽入門經典

①:每個小球都會落在根節點上,因此前兩個小球必然是一個在左子樹,一個在右子樹。

②:一般,只需要知道小球編號的奇偶性,就能知道它是最終在哪棵子樹中。

③:對於那些落入根結點左子樹來說,只需知道該小球是第幾個落在根的左子樹裡的,就可以知道它下一步該往左還是往右了。以此類推,直到小球落到葉子結點上。

程式碼:

#include<iostream>
#include<string.h>
using namespace std;
//const int maxn = 20;
//int a[1 << maxn];//結點的最大數為2^maxn-1個
int main()
{
	int D, I;
	while (cin >> D >> I)
	{

		int k = 1;
		for (int i = 0; i < D - 1; i++)
		{
			if (I % 2)//奇數
			{
				k = 2 * k;
             	I = (I + 1) / 2;
			}
			else
			{
				k = k * 2 + 1;
				I = I / 2;
			}
			
		}
        cout << k << endl;
	}
	return 0;
}