#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define endflag 0
typedef int KeyType;
typedef int InfoType;
typedef struct{
KeyType key;
InfoType otherinfo;
}ElemType;
typedef struct BSTNode{
ElemType data;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
void DeleteBST(BSTree &T,KeyType key){
BSTree p=T,q;BSTree f=NULL;
while(p){
if(p->data.key==key) break;
f=p;
if(p->data.key>key) p=p->lchild;
else
p=p->rchild;
}
if(!p) return;
if((p->lchild)&&(p->rchild)){
q=p;
BSTree 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;
return;
}
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 destroyBST(BSTree T){
if(T){
destroyBST(T->lchild);
destroyBST(T->rchild);
free(T);
}
}
BSTree searchBST(BSTree T,KeyType 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, ElemType e){
if(!T){//T==NULL
T=new BSTNode;
T->data=e;
T->lchild=T->rchild=NULL;
}
else if(e.key < T->data.key){
InsertBST(T->lchild, e);
}
else if(e.key > T->data.key){
InsertBST(T->rchild, e);
}
}
void createBST(BSTree &T){
ElemType e;
T=NULL;//初始化为空树
cin>>e.key;
while(e.key!=endflag){ //endflag为自定义结束标志
InsertBST(T,e);//插入二叉排序树中
cin>>e.key;
}
}
void inorderTraverse(BSTree T){
if(T){//T!=NULL
inorderTraverse(T->lchild);
printf("%d ", T->data.key);
inorderTraverse(T->rchild);
}
}
int main(){
BSTree T;
printf("请输入二叉树的值:(输入 0 为结束标志)\n");
createBST(T);
printf("中序遍历结果为:");
// inorderTraverse:中文 中序遍历
inorderTraverse(T);
printf("\n");
KeyType key;
printf("请输入要查找结点的 key 值:");
scanf("%d", &key);
printf("返回是:%d",searchBST(T, key));//没有该书则返回0,有的话是一串地址数
if (searchBST(T, key)) {
printf("二叉排序树中存有%d\n",key);
}else{
printf("二叉排序树中没有%d\n",key);
}
printf("请输入要删除结点的 key 值:");
scanf("%d", &key);
DeleteBST(T, key);
printf("删除结点 %d 后中序遍历结果为:", key);
// inorderTraverse:中文 中序遍历
inorderTraverse(T);
destroyBST(T);//释放内存
return 0;
}
6.3二叉排序树(二叉查找树)——结构体法
最新推荐文章于 2024-08-28 20:07:23 发布