#define FALSE 0
#define TRUE 1
#define ElemType int
#define Status int
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)>(b))
#include
#include
#include
using namespace std;
typedef struct BiTNode { // 结点结构
} BiTNode, *BiTree;
Status SearchBST (BiTree T, ElemType key,
BiTree f, BiTree &p )
{ // 在根指针 T 所指二叉排序树中递归地查找其关键字等于 key 的数据元素,若查找成功,则返回指针 p
指向该数据元素的结点,并返回TRUE;
if (!T) { p = f; return
FALSE; } // 查找不成功
else if ( EQ(key, T->data) ) { p = T;
return TRUE; } // 查找成功
else if ( LT(key, T->data) )
SearchBST (T->lchild, key, T, p );
// 在左子树中继续查找
else SearchBST (T->rchild, key, T, p );
//
在右子树中继续查找
} // SearchBST
void Delete ( BiTree &p )
{ // 从二叉排序树中删除结点 p, 并重接它的左子树或右子树
s = p->lchild; while (s->rchild)
{s = s->rchild; } // 转左,然后向右到尽头
s-> rchild = q-> rchild;// 将待删除结点的右子树重接到S上
p = p->lchild;
free(q);
} // Delete
Status InsertBST(BiTree &T, ElemType e
)
{ // 当二叉排序树中不存在关键字等于 e.key 的数据元素时,插入元素值为 e
的结点,并返回 TRUE; 否则,不进行插入并返回FALSE
BiTree p,s;
s = (BiTree) malloc (sizeof (BiTNode)); //
为新结点分配空间
s->data = e; s->lchild = s->rchild
= NULL;
if ( !p ) T = s;
// 插入 s 为新的根结点
else if ( LT(e, p->data) )
p->lchild = s;
// 插入 *s 为 *p 的左孩子
else p->rchild = s;
// 插入 *s 为 *p 的右孩子
return TRUE; //
插入成功
} // InsertBST
Status DeleteBST (BiTree &T, ElemType
key )
{ // 若二叉排序树 T 中存在其关键字等于 key 的数据元素,则删除该数据元素结点,并返回函数值
TRUE,否则返回函数值 FALSE
if (!T) return FALSE; //
不存在关键字等于key的数据元素
else {
if ( EQ (key, T->data) ) { Delete (T);
return TRUE; }//
找到关键字等于key的数据元素
else if ( LT (key, T->data) ) DeleteBST ( T->lchild, key
); // 继续在左子树中进行查找
else DeleteBST ( T->rchild, key ); // 继续在右子树中进行查找
}
} // DeleteBST
void InOrderTraverse(BiTree T)
{//中序遍历二叉树,递归
if(T){
InOrderTraverse(T->lchild);
cout<<T->data<<" ";
InOrderTraverse(T->rchild);
}
}
int arr[10] = {1,5,6,4,3,2,7,8,10,9};
int main()
{
ElemType e;
int door = 1,c,flag;
BiTree T,p;
T = NULL;
for(int i=0; i<10; ++i)
InsertBST(T,arr[i]);
while(door){
cout<<endl<<"请输入要查找元素:"; cin>>e;
if(SearchBST(T,e,NULL,p)) {
cout<<endl<<"查找成功!"<<endl<<"是否将其从二叉排序树中删除:
1.是 2.否 "<<endl;
cin>>flag;
if(flag) DeleteBST(T,e);
}
else { cout<<"查找失败!"<<endl<<"是否将元素插入到二叉排序树中:
1.是 2.否 "<<endl;
cin>>flag;
if(flag) DeleteBST(T,e); InsertBST(T,e);
}
cout<<endl<<"--------1.继续查找
2.查看二叉排序树元素
0.退出----------"<<endl<<"请输入数字继续操作:";
cin>>c;
switch(c){
case 1: door =1; break;
case 2:
cout<<"二叉排序树中序遍历为:"; InOrderTraverse(T);
cout<<endl<<"是否继续查找: 1.是 2.否
"<<endl;
cin>>flag;
if(flag){ door =1; break; }
else {
cout<<"退出程序!"<<endl;
door = 0 ; break;}
case 0: door =0; break;
default: cout<<"输入错误,退出程序!"<<endl;
door = 0; break;
} //switch
}//while
return 0;
}