[問題] zerojudge b346 二元搜尋樹快速建造

看板C_and_CPP作者 (阿毛)時間10年前發表 (2015/02/15 14:35), 10年前編輯推噓5(5011)
留言16則, 5人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) dev-c++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 小弟只會用插入法建造BST,不知有沒有其他方法快速建造BST? 題目: http://zerojudge.tw/ShowProblem?problemid=b346 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) http://codepad.org/tyKZQLPI #include <iostream> using namespace std; struct Node{ int data; Node* left; Node* right; }; void pre_order(Node* ptr){ cout<< ptr->data <<' '; if(ptr->left) pre_order(ptr->left); if(ptr->right) pre_order(ptr->right); } int main(){ int N; Node* nodes=NULL; while(cin>>N){ nodes=new Node[N]; Node* head=&nodes[0]; Node* ptr=head; cin>> head->data; head->left=NULL; head->right=NULL; for(int i=1;i<N;++i,ptr=head){ cin>> nodes[i].data; while(1){ if(nodes[i].data < ptr->data){ if(ptr->left) ptr=ptr->left; else{ ptr->left=&nodes[i]; ptr->left->left=NULL; ptr->left->right=NULL; break; } } else{ if(ptr->right) ptr=ptr->right; else{ ptr->right=&nodes[i]; ptr->right->left=NULL; ptr->right->right=NULL; break; } } } } pre_order(head); cout<<endl; delete[] nodes; nodes=NULL; } return 0; } 補充說明(Supplement): Node的設計是: struct Node{ int data; Node* left; Node* right; }; 因為題目會先告訴你總共有N個數字,所以我先創造N個Node (這樣在delete時比較方便,雖然不是正統作法) nodes=new Node[N]; 如此第i個數字會存在nodes[i-1].data; 之後是重點了...如何快速建立BST? 我只會從樹頭開始比較,對於第i個數字, 如果比較小就往左邊走,如果左邊沒有資料(left==NULL)就把left設成&nodes[i-1] 如果比較大...方法雷同。 這是沒啥創意的設計 所以就TLE了 Orz... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.166.87.155 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1424010938.A.A4B.html ※ 編輯: sunhextfn (118.166.87.155), 02/15/2015 22:41:16

02/16 00:27, , 1F
陣列
02/16 00:27, 1F

02/16 01:58, , 2F
用 scanf 取代 cin?
02/16 01:58, 2F

02/16 02:17, , 3F
稍微看了一下題目 如果是已排序好的序列
02/16 02:17, 3F

02/16 02:18, , 4F
直接硬做會O(n^2) 如果我有解出來再回文
02/16 02:18, 4F

02/16 03:17, , 5F
本來以為是 n 太大造成的,但應該就是 worst case 的關係
02/16 03:17, 5F

02/16 03:23, , 6F
維持 nlogn 就可以過
02/16 03:23, 6F

02/16 04:09, , 7F
哈哈我不會解 用排序跟segment tree有機會嗎?
02/16 04:09, 7F

02/16 04:10, , 8F
個人想法:排序求中序式分左右子樹, 用輸入順序求root
02/16 04:10, 8F

02/16 09:35, , 9F
有沒有可能是一路變大或變小的序列,就不用從root開始
02/16 09:35, 9F

02/16 09:35, , 10F
而是可以一次串上一串,雖然我覺得沒什麼道理
02/16 09:35, 10F

02/16 09:36, , 11F
這個解的worst case還是沒變好,遇到還是會一樣TLE
02/16 09:36, 11F

02/16 15:04, , 12F
剛剛解出來了...Node內多存輸入順序index和parent root
02/16 15:04, 12F

02/16 15:05, , 13F
因為資料存在陣列裡,根據數字大小呼叫std::sort()排好
02/16 15:05, 13F

02/16 15:08, , 14F
再根據index大小,由sort完的順序依序接起BST
02/16 15:08, 14F

02/16 15:09, , 15F
原則是,child root的index > parent root的index
02/16 15:09, 15F

02/17 01:17, , 16F
恭喜!
02/17 01:17, 16F
文章代碼(AID): #1KuAwwfB (C_and_CPP)
文章代碼(AID): #1KuAwwfB (C_and_CPP)