數據結構-二叉排序樹

輸入互不相同的一組整數,構造一棵二叉排序樹,要求:
① 按遞減有序的順序輸出;
② 輸入一個整數,查找該整數是否在該二叉排序樹中,查找成功返回1,否則返回0;
③ 在②中,若查找成功,則將該結點從二叉排序樹中刪除。

`#include<stdio.h>
#include<bits/stdc++.h>
typedef struct Bitnode{
int data;
struct Bitnode *rchild,*lchild;
}Bitnode,*Bitree;

int searchbst(Bitree bst,int key,Bitree &p){
//查找
Bitnode *s=bst,*f=NULL;
if(!s){
p=f;
return 0;
}
while(s!=NULL)
if(keys->data){
p=s;
return 1;
}
else if(key>s->data){
f=s;
s=s->rchild;
}
else{
f=s;
s=s->lchild;
}
p=f;
return 0;
}
int searchbst2(Bitree bst,int key){
//查找
Bitnode *s=bst,*f=NULL;
if(!s){
return 0;
}
while(s!=NULL)
if(key
s->data){
return 1;
}
else if(key>s->data){
f=s;
s=s->rchild;
}
else{
f=s;
s=s->lchild;
}
return 0;
}

void insertbst(Bitree &bst,int e){
//插入
Bitnode *s,*p;
if(bst==NULL){
bst=(Bitree)malloc(sizeof(Bitnode));
bst->data=e;
bst->lchild=bst->rchild=NULL;
}
else{
if(!searchbst(bst,e,p)){
s=(Bitree)malloc(sizeof(Bitnode));
s->data=e;
s->lchild=s->rchild=NULL;
if(edata)
p->lchild=s;
else
p->rchild=s;
}
}
}

void creatbst(Bitree &bst){
//建立二叉排序樹
Bitnode *p;
int a;
bst=NULL;
scanf("%d",&a);
while(a!=0){
if(!searchbst(bst,a,p))
insertbst(bst,a);
scanf("%d",&a);
}
}

void traverse(Bitree bt){
//遞歸中序遍歷
if(bt){
traverse(bt->rchild);
printf("%d “,bt->data);
traverse(bt->lchild);
}
}
void deleten(Bitree &bst,int key){
//刪除值爲key的節點
Bitnode *pc,*q,*s,*p=bst,*f=NULL;
while(p && p->data!=key){
f=p;
if(p->data>key)
p=p->lchild;
else
p=p->rchild;
}
if(!p){
printf(“該樹中沒有需刪除的節點\n”);return;
}
if(p->lchild && p->lchild){
q=p; s=p->lchild;
while(s->rchild){
q=s;s=s->rchild;
}
p->data=s->data;
if(qp)
q->lchild=s->lchild;
else
q->rchild=s->lchild;
free(s);
}
else{
if(p->lchild)
pc=p->lchild;
else
pc=p->rchild;
if(!f)
bst=pc;
else if(f->lchild
p)
f->lchild=pc;
else
f->rchild=pc;
free§;
}
}
int main()
{
int x;
Bitree bst;
creatbst(bst);
traverse(bst);
printf(”\n輸入你要查找的元素:\n");
scanf("%d",&x);
if(searchbst2(bst,x)){
printf(“查找成功!\n”);
deleten(bst,x);
printf(“該節點已刪除!\n”);
}

else
 	printf("查找失敗!\n");

}`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章