数据结构(C语言)课设8——二叉排序树的基本应用
题目描述:
编写算法实现对依次输入的关键字序列建立二叉排序树,并能实现二叉排序树的查找、插入和删除运算。
#include <iostream>
using namespace std;
typedef struct
{
int key;
int otherInfo;
}keyInfo;
typedef struct BSTNode
{
keyInfo data;
struct BSTNode *lchild, *rchild;
}BSTNode, *BSTree;
BSTree SearchBST(BSTree &T, int key)
{
if(!T || key == T->data.key) return T;
else if(key < T->data.key) return SearchBST(T->lchild, key);
else return SearchBST(T->rchild, key);
}
void InsertBST(BSTree &T, int &e)
{
BSTNode *S;
if(!T)
{
S = new BSTNode;
S->data.key = e;
S->lchild = S->rchild = NULL;
T = S;
}
else if(e < T->data.key)
InsertBST(T->lchild, e);
else if(e > T->data.key)
InsertBST(T->rchild, e);
}
void CreateBST(BSTree &T)
{
int e;
T = NULL;
cout<<"请输入要排序的数据(以-1作为结束标志): ";
while(cin>>e)
{
if(e != -1)
{
InsertBST(T, e);
}
else
break;
}
}
void FiOrderTraverse(BSTree &T){
BSTNode *p;
p = T;
if(p){
cout<<p->data.key<<" ";
FiOrderTraverse(p->lchild);
FiOrderTraverse(T -> rchild);
}
}
void DeleteBST(BSTree &T, int &e)
{
BSTNode *p, *s, *q, *f;
p = T; f = NULL;
while(p)
{
if(p->data.key == e) break;
f = p;
if(p->data.key > e) p = p->lchild;
else p = p->rchild;
}
if(!p) cout<<"没找到"<<endl;
q = p;
if((p->lchild) && (p->rchild))
{
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)
{
p = p->lchild;
}
else if(!p->lchild)
{
p = p->rchild;
}
if(!f) T = p;
else if(q == f->lchild) f->lchild = p;
else f ->rchild = p;
delete q;
}
int main()
{
BSTNode *T;
int e;
CreateBST(T);
cout<<"先序遍历输出创建好的二叉排序树为: "<<endl;
FiOrderTraverse(T);cout<<endl;
cout<<"请输入要增加的数据:"; cin>>e;
InsertBST(T, e);
cout<<"增加后的二叉排序树为(先序): "<<endl;
FiOrderTraverse(T);cout<<endl;
cout<<"请输入要删除的数据:"<<endl; cin>>e;
DeleteBST(T, e);
cout<<"删除后的二叉排序树为(先序): "<<endl;
FiOrderTraverse(T);cout<<endl;
cout<<"请输入要查询的数据: "; cin>>e;
if(SearchBST(T, e) == NULL)
{
cout<<"查找失败!";
}
else
{
cout<<"查询成功二叉排序树有此数据 : "<<SearchBST(T, e)->data.key;
}
return 0;
}
此博文只用于记录博主学习过程(有问题可评论)