二叉樹的編號優化--小球下落
阿新 • • 發佈:2019-02-06
上一篇的程式碼中由於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; }