二叉排序树基本操作的实现:建立二叉排序树,插入删除数据(C语言)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct BTree{
	int date;
	BTree *lchild;
	BTree *rchild;
}BTree;
//插入数据 
int BSTInsert(BTree *&p,int key){
	
	if(p==NULL){
		p=(BTree*)malloc(sizeof(BTree));
		p->date=key;
		p->lchild=NULL;
		p->rchild=NULL;
		return 1;
	}else {
		if(key==p->date) return 0;
		else if(key<p->date){
			return BSTInsert(p->lchild,key);
		}else if(key>p->date){
		    return BSTInsert(p->rchild,key); 
		} 
	}
} 

int BSTDelete(BTree *&p,int key){
	BTree *x,*y;
	x=p;
	y=NULL;
	int flag=-1;
	while(x->date!=key){
		if(key>x->date){
			y=x;//记录父节点
			x=x->rchild; 
			flag=1;
		}else{
			y=x;
			x=x->lchild;
			flag=0;
		}	
	}
	if(x->date!=key){//如果未找到则返回两个空指针 
		x=NULL;
		y=NULL; 
		printf("不存在此元素");
		return 0;
	}
	if(x!=NULL){
		if(x->lchild!=NULL&&x->rchild!=NULL){
	     	BTree *t=x;
			y=x;
			x=x->lchild;//向左走一步
			while(x->rchild!=NULL){
				y=x;
				x=x->rchild;//向右走到头 
			} 
			t->date=x->date;
			if(x->lchild!=NULL) y->rchild=x->lchild;
			else y->rchild=NULL;
			free(x); 
			return 1;	
		}else if(x->rchild!=NULL&&x->lchild==NULL){
		       if(y->lchild=x) y->lchild=x->rchild;	
		       else if(y->rchild=x) y->rchild=x->rchild;
		       free(x);
		       return 1;
		}else if(x->lchild!=NULL&&x->rchild==NULL){
		    if(y->lchild=x) y->lchild=x->lchild;	
		    else if(y->rchild=x) y->rchild=x->lchild;
		    free(x);
		    return 1;
		}
		else if(x->lchild==NULL&&x->rchild==NULL){
			if(y->lchild=x) y->lchild=NULL;	
		    else if(y->rchild=x) y->rchild=NULL;
		    free(x);
		    return 1;
		}
	}
} 
void createBTree(BTree *&p,int t[],int length){
	for(int i=0;i<length;i++){
		int j=BSTInsert(p,t[i]);
		//printf("%d  ",j);
	}
}

int main(){
	int temp[]={5,1,8,0,3,7,9,2,4};
	BTree *p=NULL;
	createBTree(p,temp,9);
	printf("%d  ",p->date);
	printf("%d  ",p->lchild->date);
	printf("%d  ",p->rchild->date);
	int r=BSTDelete(p,5);//删除5 
	printf("\n结果:%d",r);
	printf("\n%d  ",p->date);
	r=BSTDelete(p,1);//删除5 
	printf("\n结果:%d",r);
	printf("\n%d  ",p->lchild->date);
}

代码运行结果:

发布了90 篇原创文章 · 获赞 36 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_37716512/article/details/104249534