【算法分析】
本算法代码改编自严蔚敏编著的《数据结构(C语言版|第2版)》的随书代码。主要是利用了自己熟悉的C++语法进行改编,希望对大家学习二叉排序树的实现有所帮助。
【算法代码】
#include <bits/stdc++.h>
using namespace std;
struct BSTNode {
char data;
BSTNode *lchild,*rchild;
};
typedef struct BSTNode *BSTree;
BSTree SearchBST(BSTree T,char key) {
if((!T)|| key==T->data) return T;
else if (key<T->data) return SearchBST(T->lchild,key);
else return SearchBST(T->rchild,key);
}
void InsertBST(BSTree &T,char e) {
if(!T) {
BSTree S=new BSTNode;
S->data=e;
S->lchild=S->rchild=NULL;
T=S;
} else if(e<T->data)
InsertBST(T->lchild,e);
else if(e>T->data)
InsertBST(T->rchild,e);
}
void CreateBST(BSTree &T) {
T=NULL;
char e;
cin>>e;
while(e!='#') {
InsertBST(T,e);
cin>>e;
}
}
void DeleteBST(BSTree &T,char key) {
BSTree p=T;
BSTree f=NULL;
BSTree q;
BSTree s;
while(p) {
if(p->data==key) break;
f=p;
if(p->data>key) p=p->lchild;
else p=p->rchild;
}
if(!p) return;
if((p->lchild) && (p->rchild)) {
q=p;
s=p->lchild;
while(s->rchild) {
q=s;
s=s->rchild;
}
p->data=s->data;
if(q!=p) {
q->rchild=s->lchild;
} else q->lchild=s->lchild;
delete s;
} else {
if(!p->rchild) {
q=p;
p=p->lchild;
}else if(!p->lchild) {
q=p;
p=p->rchild;
}
if(!f) T=p;
else if(q==f->lchild) f->lchild=p;
else f->rchild=p;
delete q;
}
}
void InOrderTraverse(BSTree &T) {
if(T){
InOrderTraverse(T->lchild);
cout<<T->data<<" ";
InOrderTraverse(T->rchild);
}
}
int main() {
BSTree T;
cout<<"Enter chars ended with # and separated by Spaces:";
CreateBST(T);
cout<<"InOrderTraverse before delete:";
InOrderTraverse(T);
cout<<endl;
cout<<"Please enter the char to be found:";
char key;
cin>>key;
BSTree ans=SearchBST(T,key);
if(ans) {
cout<<"Find "<<key<<endl;
} else {
cout<<"Not find "<<key<<endl;
}
cout<<"Please enter the char to be deleted:";
cin>>key;
DeleteBST(T,key);
cout<<"InOrderTraverse after delete:";
InOrderTraverse(T);
return 0;
}
/*
in:
45 24 53 12 #
out:
Enter chars ended with # and separated by Spaces:45 24 53 12 #
InOrderTraverse before delete:1 2 3 4 5
Please enter the char to be found:8
Not find 8
Please enter the char to be deleted:4
InOrderTraverse after delete:1 2 3 5
*/