/*=========================================================
6-7節 二元搜尋樹:建立,節點插入,節點搜尋,節點刪除
*BstCreate() 建立二元搜尋樹
*BstInsert() 插入節點
*BstSearch() 搜尋節點
*BstDelete() 刪除節點
=========================================================
*/
#include <cstdlib>
#include <fstream>
#include <iostream>
using namespace std;
typedef struct tagNode
{
char left_thread;
struct tagNode *left_c;
int data;
char right_thread;
struct tagNode *right_c;
}TNode;
TNode *listA;
TNode *BstCreate(void);
TNode *BstInsert(TNode *,TNode *);
TNode *BstSearch(TNode *t,int);
TNode *BstDelete(TNode *t,int);
void InOrder(TNode *t);
int main(int argc, char *argv[])
{
TNode *p;
int data,LoopFlag=1;
int choose=9;
//listA=BstCreate();
while(LoopFlag)
{
if (choose!=9)
{
cout << "\n 根: "<<listA->data<<" BST中序: ";
InOrder(listA);
}
//cout << endl << "(1)插入資料\n(2)搜尋資料\n(3)刪除資料\n(0)結束=> ";
choose=9;
cin >> choose;
cout <<"\n"<< choose;
switch(choose)
{
case 0:
LoopFlag=0;
break; /*結束程式*/
case 1:
cout << " 請輸入欲建立之資料=> ";
cin >> data;
p=new TNode;
p->data=data;
listA=BstInsert(listA,p);
break;
case 2:
cout << " 請輸入欲搜尋之資料=> ";
cin >> data;
if(BstSearch(listA,data) == NULL)
cout << "找不到資料" << endl;
else
cout << "找到!!!" << endl;
break;
case 3:
cout << " 請輸入欲刪除之資料=>";
cin >> data;
cout << data;
TNode *d;
d = BstDelete(listA,data);
if(d == NULL)
cout << " 刪除資料錯誤失敗!!" << endl;
else
{
listA=d;
cout << " 刪除完成!!" << endl;
}
break;
default:
cout << "選項錯誤" << endl;
LoopFlag=0;
break; /*結束程式*/
}
}
//system("PAUSE");
return EXIT_SUCCESS;
}
void InOrder(TNode *p)
{
if(p != NULL)
{
InOrder(p->left_c);
cout << p->data << " ";
InOrder(p->right_c);
}
}
TNode *BstInsert(TNode *t,TNode *p)
{
TNode *r,*q;
char direction;
p->left_c=p->right_c=NULL;
if(t == NULL)
t=p;
else
{
q=t;
while(q != NULL)
{
if(p->data < q->data)
{
direction=1;
r=q;
q=q->left_c;
}
else if(p->data > q->data)
{
direction=0;
r=q;
q=q->right_c;
}
else
return(t);
}
if (direction==1)
r->left_c=p;
else
r->right_c=p;
}
return(t);
}
TNode *BstCreate(void)
{
fstream datafile;
int data;
TNode *t,*p;
datafile.open("BST.dat",ios::in);
t=NULL;
datafile >> data;
while(!datafile.eof())
{
p=new TNode;
p->data=data;
t=BstInsert(t,p);
datafile >> data;
}
return(t);
}
TNode *BstSearch(TNode *t,int key)
{
while(t != NULL)
{
if(key == t->data)
return(t);
else if(key < t->data)
t=t->left_c;
else
t=t->right_c;
}
return(NULL);
}
TNode *BstDelete(TNode *p,int key)
{
int found=0,direction=0;
TNode *r,*q,*s,*t;
r=q=s=NULL;
t=p;
while(p!=NULL && !found)
{
if(key == p->data)
found=1;
else if(key < p->data)
{
direction=1;
r=p;
p=p->left_c;
}
else
{
direction=0;
r=p;
p=p->right_c;
}
}
if(p == NULL)
return(NULL);
if(r == NULL)
{
cout<<"\n rrr \n";
if(p->right_c == NULL)
return(p->left_c);
else if(p->left_c == NULL)
return(p->right_c);
}
if(p->right_c == NULL)
{
cout<<"\n p-r \n";
if(direction == 1)
r->left_c=p->left_c;
else
r->right_c=p->left_c;
}
else if(p->left_c == NULL)
{
cout<<"\n p-l \n";
if(direction == 1)
r->left_c=p->right_c;
else
r->right_c=p->right_c;
}
else
{
cout<<"\n p------ \n";
s=p;
if (p->left_c != NULL)
{
q=p->left_c;
while(q->right_c != NULL)
{
s=q;
q=q->right_c;
}
p->data=q->data;
if(p == s)
s->left_c=q->left_c;
else
s->right_c=q->left_c;
}
else if (p->right_c != NULL)
{
q=p->right_c;
while(q->left_c != NULL)
{
s=q;
q=q->left_c;
}
p->data=q->data;
if(p == s)
s->right_c=q->right_c;
else
s->left_c=q->right_c;
}
}
return(t);
}
Lyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCSA2LTfnr4Ag5LqM5YWD5pCc5bCL5qi577ya5bu656uLLOevgOm7nuaPkuWFpSznr4Dpu57mkJzlsIss56+A6bue5Yiq6ZmkCiAKICAgICAgICAgICpCc3RDcmVhdGUoKSAgICAgICAgIOW7uueri+S6jOWFg+aQnOWwi+aouQogICAgICAgICAgKkJzdEluc2VydCgpICAgICAgICAg5o+S5YWl56+A6bueCiAgICAgICAgICAqQnN0U2VhcmNoKCkgICAgICAgICDmkJzlsIvnr4Dpu54KICAgICAgICAgICpCc3REZWxldGUoKSAgICAgICAgIOWIqumZpOevgOm7ngogCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiovCiAKI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxmc3RyZWFtPgojaW5jbHVkZSA8aW9zdHJlYW0+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAp0eXBlZGVmIHN0cnVjdCB0YWdOb2RlCiAgICAgICAgewogICAgICAgICAgICAgICAgY2hhciBsZWZ0X3RocmVhZDsKICAgICAgICAgICAgICAgIHN0cnVjdCB0YWdOb2RlICpsZWZ0X2M7CiAgICAgICAgICAgICAgICBpbnQgZGF0YTsKICAgICAgICAgICAgICAgIGNoYXIgcmlnaHRfdGhyZWFkOwogICAgICAgICAgICAgICAgc3RydWN0IHRhZ05vZGUgKnJpZ2h0X2M7CiAgICAgICAgfVROb2RlOwpUTm9kZSAqbGlzdEE7CiAKVE5vZGUgKkJzdENyZWF0ZSh2b2lkKTsKVE5vZGUgKkJzdEluc2VydChUTm9kZSAqLFROb2RlICopOwpUTm9kZSAqQnN0U2VhcmNoKFROb2RlICp0LGludCk7ClROb2RlICpCc3REZWxldGUoVE5vZGUgKnQsaW50KTsKdm9pZCAgSW5PcmRlcihUTm9kZSAqdCk7CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CiAgICBUTm9kZSAqcDsKICAgIGludCBkYXRhLExvb3BGbGFnPTE7CiAgICBpbnQgY2hvb3NlPTk7CiAKICAgIC8vbGlzdEE9QnN0Q3JlYXRlKCk7CiAKICAgIHdoaWxlKExvb3BGbGFnKQogICAgewoJCWlmIChjaG9vc2UhPTkpCgkJewogICAgICAgICAgICBjb3V0IDw8ICJcbiDmoLk6ICI8PGxpc3RBLT5kYXRhPDwiICBCU1TkuK3luo86ICI7CiAgICAgICAgCUluT3JkZXIobGlzdEEpOwoJCX0KICAgICAgICAvL2NvdXQgPDwgZW5kbCA8PCAiKDEp5o+S5YWl6LOH5paZXG4oMinmkJzlsIvos4fmlplcbigzKeWIqumZpOizh+aWmVxuKDAp57WQ5p2fPT4gIjsKICAgICAgICBjaG9vc2U9OTsKICAgICAgICBjaW4gPj4gY2hvb3NlOwoJCWNvdXQgPDwiXG4iPDwgY2hvb3NlOwogICAgICAgIHN3aXRjaChjaG9vc2UpCiAgICAgICAgewogICAgICAgICAgICBjYXNlIDA6CgkJCQlMb29wRmxhZz0wOwogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgLyrntZDmnZ/nqIvlvI8qLwogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBjb3V0IDw8ICIg6KuL6Ly45YWl5qyy5bu656uL5LmL6LOH5paZPT4gIjsKICAgICAgICAgICAgICAgIGNpbiA+PiBkYXRhOwogICAgICAgICAgICAgICAgcD1uZXcgVE5vZGU7CiAgICAgICAgICAgICAgICBwLT5kYXRhPWRhdGE7CiAgICAgICAgICAgICAgICBsaXN0QT1Cc3RJbnNlcnQobGlzdEEscCk7CiAgICAgICAgICAgIAlicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgY291dCA8PCAiIOiri+i8uOWFpeassuaQnOWwi+S5i+izh+aWmT0+ICI7CiAgICAgICAgICAgICAgICBjaW4gPj4gZGF0YTsKICAgICAgICAgICAgICAgIGlmKEJzdFNlYXJjaChsaXN0QSxkYXRhKSA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgIGNvdXQgPDwgIuaJvuS4jeWIsOizh+aWmSIgPDwgZW5kbDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBjb3V0IDw8ICLmib7liLAhISEiIDw8IGVuZGw7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgY291dCA8PCAiIOiri+i8uOWFpeassuWIqumZpOS5i+izh+aWmT0+IjsKICAgICAgICAgICAgICAgIGNpbiA+PiBkYXRhOwogICAgICAgICAgICAgICAgY291dCA8PCBkYXRhOwogCiAgICAgICAgICAgICAgICBUTm9kZSAqZDsKICAgICAgICAgICAgICAgIGQgPSBCc3REZWxldGUobGlzdEEsZGF0YSk7CgkJCQlpZihkID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgY291dCA8PCAiIOWIqumZpOizh+aWmemMr+iqpOWkseaVlyEhIiA8PCBlbmRsOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgCWxpc3RBPWQ7CiAgICAgICAgICAgICAgICAgICAgY291dCA8PCAiIOWIqumZpOWujOaIkCEhIiA8PCBlbmRsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBjb3V0IDw8ICLpgbjpoIXpjK/oqqQiIDw8IGVuZGw7CiAgICAgICAgICAgICAgICBMb29wRmxhZz0wOwogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgLyrntZDmnZ/nqIvlvI8qLwogICAgICAgIH0KICAgICB9CiAgICAgLy9zeXN0ZW0oIlBBVVNFIik7CglyZXR1cm4gRVhJVF9TVUNDRVNTOwp9Cgp2b2lkIEluT3JkZXIoVE5vZGUgKnApCnsKICAgIGlmKHAgIT0gTlVMTCkKICAgIHsKICAgICAgICBJbk9yZGVyKHAtPmxlZnRfYyk7CiAgICAgICAgY291dCA8PCBwLT5kYXRhIDw8ICIgIjsKICAgICAgICBJbk9yZGVyKHAtPnJpZ2h0X2MpOwogICAgfQp9CiAKVE5vZGUgKkJzdEluc2VydChUTm9kZSAqdCxUTm9kZSAqcCkKewogICAgVE5vZGUgKnIsKnE7CiAgICBjaGFyIGRpcmVjdGlvbjsKIAogICAgcC0+bGVmdF9jPXAtPnJpZ2h0X2M9TlVMTDsKICAgIGlmKHQgPT0gTlVMTCkKICAgIAl0PXA7CiAgICBlbHNlCiAgICB7CiAgICAgICAgcT10OwogICAgICAgIHdoaWxlKHEgIT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIGlmKHAtPmRhdGEgPCBxLT5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkaXJlY3Rpb249MTsKICAgICAgICAgICAgICAgIHI9cTsKICAgICAgICAgICAgICAgIHE9cS0+bGVmdF9jOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYocC0+ZGF0YSA+IHEtPmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbj0wOwogICAgICAgICAgICAgICAgcj1xOwogICAgICAgICAgICAgICAgcT1xLT5yaWdodF9jOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHJldHVybih0KTsKICAgICAgICB9CiAgICAgICAgaWYgKGRpcmVjdGlvbj09MSkKICAgICAgICAgICAgci0+bGVmdF9jPXA7CiAgICAgICAgZWxzZQogICAgICAgICAgICByLT5yaWdodF9jPXA7CiAgICB9CiAgICByZXR1cm4odCk7Cn0KIAogClROb2RlICpCc3RDcmVhdGUodm9pZCkKewogICAgZnN0cmVhbSBkYXRhZmlsZTsKICAgIGludCBkYXRhOwogICAgVE5vZGUgKnQsKnA7CiAKICAgIGRhdGFmaWxlLm9wZW4oIkJTVC5kYXQiLGlvczo6aW4pOwogCiAgICB0PU5VTEw7CglkYXRhZmlsZSA+PiBkYXRhOwogICAgd2hpbGUoIWRhdGFmaWxlLmVvZigpKQogICAgewogICAgICAgIHA9bmV3IFROb2RlOwogICAgICAgIHAtPmRhdGE9ZGF0YTsKICAgICAgICB0PUJzdEluc2VydCh0LHApOwoJCWRhdGFmaWxlID4+IGRhdGE7CiAgICB9CiAgICByZXR1cm4odCk7Cn0KIAogClROb2RlICpCc3RTZWFyY2goVE5vZGUgKnQsaW50IGtleSkKewogICAgd2hpbGUodCAhPSBOVUxMKQogICAgewogICAgICAgIGlmKGtleSA9PSB0LT5kYXRhKQogICAgICAgICAgICByZXR1cm4odCk7CiAgICAgICAgZWxzZSBpZihrZXkgPCB0LT5kYXRhKQogICAgICAgICAgICB0PXQtPmxlZnRfYzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHQ9dC0+cmlnaHRfYzsKICAgIH0KICAgIHJldHVybihOVUxMKTsKfQogCiAKVE5vZGUgKkJzdERlbGV0ZShUTm9kZSAqcCxpbnQga2V5KQp7CiAgICBpbnQgZm91bmQ9MCxkaXJlY3Rpb249MDsKICAgIFROb2RlICpyLCpxLCpzLCp0OwogCiAgICByPXE9cz1OVUxMOwogICAgdD1wOwogCiAgICB3aGlsZShwIT1OVUxMICYmICFmb3VuZCkKICAgIHsKICAgICAgICBpZihrZXkgPT0gcC0+ZGF0YSkKICAgICAgICAgICAgZm91bmQ9MTsKICAgICAgICBlbHNlIGlmKGtleSA8IHAtPmRhdGEpCiAgICAgICAgewogICAgICAgIAlkaXJlY3Rpb249MTsKICAgICAgICAgICAgcj1wOwogICAgICAgICAgICBwPXAtPmxlZnRfYzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZGlyZWN0aW9uPTA7CiAgICAgICAgICAgIHI9cDsKICAgICAgICAgICAgcD1wLT5yaWdodF9jOwogICAgICAgIH0KICAgIH0KICAgIGlmKHAgPT0gTlVMTCkKICAgICAgICByZXR1cm4oTlVMTCk7CiAgICBpZihyID09IE5VTEwpCiAgICB7CiAgICAJY291dDw8IlxuIHJyciBcbiI7CiAgICAgICAgaWYocC0+cmlnaHRfYyA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4ocC0+bGVmdF9jKTsKICAgICAgICBlbHNlIGlmKHAtPmxlZnRfYyA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4ocC0+cmlnaHRfYyk7CiAgICB9CiAgICBpZihwLT5yaWdodF9jID09IE5VTEwpCiAgICB7CiAgICAJY291dDw8IlxuIHAtciBcbiI7CiAgICAgICAgaWYoZGlyZWN0aW9uID09IDEpCiAgICAgICAgICAgIHItPmxlZnRfYz1wLT5sZWZ0X2M7CiAgICAgICAgZWxzZQogICAgICAgICAgICByLT5yaWdodF9jPXAtPmxlZnRfYzsKICAgIH0KICAgIGVsc2UgaWYocC0+bGVmdF9jID09IE5VTEwpCiAgICB7CiAgICAJY291dDw8IlxuIHAtbCBcbiI7CiAgICAgICAgaWYoZGlyZWN0aW9uID09IDEpCiAgICAgICAgICAgIHItPmxlZnRfYz1wLT5yaWdodF9jOwogICAgICAgIGVsc2UKICAgICAgICAgICAgci0+cmlnaHRfYz1wLT5yaWdodF9jOwogICAgfQogICAgZWxzZQogICAgewogICAgCWNvdXQ8PCJcbiBwLS0tLS0tIFxuIjsKICAgICAgICBzPXA7CiAgICAgICAgaWYgKHAtPmxlZnRfYyAhPSBOVUxMKQogICAgICAgIHsKICAgICAgICAJcT1wLT5sZWZ0X2M7CiAgICAgICAgCXdoaWxlKHEtPnJpZ2h0X2MgIT0gTlVMTCkKICAgICAgICAJewogICAgICAgICAgICAJcz1xOwogICAgICAgICAgICAJcT1xLT5yaWdodF9jOwogICAgICAgIAl9CiAgICAgICAgCXAtPmRhdGE9cS0+ZGF0YTsKICAgICAgICAJaWYocCA9PSBzKQogICAgICAgICAgICAJcy0+bGVmdF9jPXEtPmxlZnRfYzsKICAgICAgICAJZWxzZQogICAgICAgICAgICAJcy0+cmlnaHRfYz1xLT5sZWZ0X2M7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHAtPnJpZ2h0X2MgIT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgCXE9cC0+cmlnaHRfYzsKICAgICAgICAJd2hpbGUocS0+bGVmdF9jICE9IE5VTEwpCiAgICAgICAgCXsKICAgICAgICAgICAgCXM9cTsKICAgICAgICAgICAgCXE9cS0+bGVmdF9jOwogICAgICAgIAl9CiAgICAgICAgCXAtPmRhdGE9cS0+ZGF0YTsKICAgICAgICAJaWYocCA9PSBzKQogICAgICAgICAgICAJcy0+cmlnaHRfYz1xLT5yaWdodF9jOwogICAgICAgIAllbHNlCiAgICAgICAgICAgIAlzLT5sZWZ0X2M9cS0+cmlnaHRfYzsKICAgICAgICB9CiAKICAgIH0KICAgIHJldHVybih0KTsKfQ==