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

作者: sunhextfn (阿毛)   2015-02-15 22:35:34
開發平台(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...
作者: s25g5d4 (function(){})()   2015-02-16 00:27:00
陣列
作者: longlongint (華哥爾)   2015-02-16 01:58:00
用 scanf 取代 cin?稍微看了一下題目 如果是已排序好的序列直接硬做會O(n^2) 如果我有解出來再回文
作者: holydc (のヮの)   2015-02-16 03:17:00
本來以為是 n 太大造成的,但應該就是 worst case 的關係維持 nlogn 就可以過
作者: longlongint (華哥爾)   2015-02-16 04:09:00
哈哈我不會解 用排序跟segment tree有機會嗎?個人想法:排序求中序式分左右子樹, 用輸入順序求root
作者: lc85301 (pomelocandy)   2015-02-16 09:35:00
有沒有可能是一路變大或變小的序列,就不用從root開始而是可以一次串上一串,雖然我覺得沒什麼道理這個解的worst case還是沒變好,遇到還是會一樣TLE
作者: sunhextfn (阿毛)   2015-02-16 15:04:00
剛剛解出來了...Node內多存輸入順序index和parent root因為資料存在陣列裡,根據數字大小呼叫std::sort()排好再根據index大小,由sort完的順序依序接起BST原則是,child root的index > parent root的index
作者: longlongint (華哥爾)   2015-02-17 01:17:00
恭喜!

Links booklink

Contact Us: admin [ a t ] ucptt.com