数据结构-二叉排序树

输入互不相同的一组整数,构造一棵二叉排序树,要求:
① 按递减有序的顺序输出;
② 输入一个整数,查找该整数是否在该二叉排序树中,查找成功返回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(key==s->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(e<p->data)
				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(q==p)
			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(p);
	}
} 
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");
	 	
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值