[问题] 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