標籤:斐波那契數列 樹 建立二叉樹 求二叉樹寬度
【題目描述】
我們都知道,火車沿途會經過各種大大小小的站,火車在可能會跳過某些站不停靠,但是肯定不會連續跳過兩站及以上。假設沿途一共會有m個月台(火車起初停靠在第一站),一共有多少種不同的停站方案?
【輸入】
輸入的第一行為一個整數 T (0 < T < 40),接下來為 T 組測試資料,每組只有一個整數 m (0 < m < 40),表示月台的數量。
【輸出】
對於每組測試資料,輸出只有一行為一個整數,表示可供選擇的方案數。
【演算法思想】
1.世界本可以更簡單但是有的人就是喜歡沒事找事,簡單的路走起來覺得不進階,其實,是自己很傻逼;
2.直接使用兩個數字就可以解決的事情,筆者生來賤命一條,就喜歡用樹的結構上去幹,所以說傻逼;
3.直接使用斐波那契數列就可以解決的演算法,筆者就是採用了二叉樹的寬度求解,所以說不是一般的傻逼;
4.和使用非遞迴的思想實現圖的深度遍曆一樣,本文只是為了資料結構而資料結構,這在演算法時間消耗和空間消耗以及比這本就不多的腦細胞消耗上來說是很不划算的,所以說傻逼簡直了!
綜上,不要盲目資料結構,想好了兼得的方式在動筆!!!
【屌絲代碼】
<pre name="code" class="cpp">#include<iostream>#include<stack>#include<vector>#include<queue>using namespace std;typedef struct BiTNode{int data;BiTNode *lc;BiTNode *rc;}BiTNode;BiTNode* createTree(BiTNode*head,int lay,queue<int> q){if(lay == 0){head = NULL;return NULL;}head = new BiTNode;head->data = 1;if(q.size() == 0){head->lc = createTree(head->lc,lay-1,q);q.push(head->data);head->rc = createTree(head->rc,lay-1,q);}else{q.pop();head->lc = createTree(head->lc,lay-1,q);head->rc = NULL;}return head;};int widthTree(BiTNode*head,int lay){queue<BiTNode*> q;int pos,size,width(0),count;q.push(head);BiTNode* tmp;while(!q.empty()){size = q.size();pos = 0;count = 0;while(pos<size){tmp = q.front();q.pop();count++;if(tmp->lc!=NULL){q.push(tmp->lc);}if(tmp->rc!=NULL){q.push(tmp->rc);}pos++;}if(count>width){width = count;}}return width;};int main(){int time,lay_num,width;BiTNode* head = NULL;cin>>time; // 輸入測寬次數while(time--){cin>>lay_num; // 輸入二叉樹層數queue<int> q;//cout<<q.size()<<endl;head = createTree(head,lay_num,q); // 建樹width = widthTree(head,lay_num); // 計算二叉樹,樹寬。cout<<width<<endl;}return 0;}
【小結】
1.建立二叉樹時,對未安排資料額的節點,賦空值是很有必要的;
2.對二叉樹求取樹寬時,遇到建樹不標準的時候,判斷節點是否存在,不僅僅是指標為空白的判斷很重要,樹的結點資料也可以作為節點存在的判據。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
C++ LOL OJ 計算火車停站方案