数据结构——二叉搜索树

本篇使用c实现二叉搜索树的初始化、插入和删除

需要强调的是在删除时会有两种情况,即待删除结点有左右两个结点和只有一个或者没有结点时。
若只有一个结点或没有结点,则直接将子结点赋给当前结点或者将其直接删除即可。但若是待删除结点存在左右两个结点,那么需要将右子树的最大值或者左子树的最小值将右子树的最小结点传给当前结点
代码如下

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

typedef struct {
	int data;
	struct Tree* Lch;
	struct Tree* Rch;
}Tree,*LTree;

LTree InitTree(LTree T) {   //初始化二叉树
	T = (LTree)malloc(sizeof(Tree));
	T = NULL;
	return T;
}
int IsEmpty(LTree T) {
	if (T == NULL) {
		return 1;
	}
	else {
		return 0;
	}
}
LTree FindMax(LTree T) {    //寻找最大的结点,即寻找到最右边的结点
	if (IsEmpty(T)) {
		printf("Tree is Empty\n");
		return;
	}
	else if(T->Rch!=NULL){  
		return FindMax(T->Rch);
	}
	else {
		return T;
	}
}

LTree FindMin(LTree T) {    //寻找最小结点即,寻找到最左边的结点
	if (IsEmpty(T)) {
		printf("Tree is Empty\n");
		return;
	}
	else if (T->Lch != NULL) {
		return FindMax(T->Lch);
	}
	else {
		return T;
	}
}

LTree InsertTree(LTree T,int d) {  //插入操作
	LTree p = (LTree)malloc(sizeof(Tree));  //存储将要存入的值
	p->data = d;
	p->Rch = NULL;
	p->Lch = NULL;
	if (IsEmpty(T)) {
		T = p;
	}
	else if (d < T->data) {   //如果要存入的值小于当前结点
		T->Lch = InsertTree(T->Lch, d);  //就向左继续搜寻,直到最末尾处
	}
	else if (d >= T->data) {  //当存入的值大于当前结点时
		T -> Rch = InsertTree(T->Rch, d);
	}
	return T;
}

LTree Delete(LTree T,int x) {  //删除操作
	if (IsEmpty(T)) {
		printf("cnm't delete");
	}
	else if (x > T->data) {  //寻找要删除的值,大于当前结点就向右继续寻找
		T->Rch = Delete(T->Rch, x);
	}
	else if (x < T->data) {  //小于向左寻找
		T->Lch = Delete(T->Lch, x);
	}
	else {    //找到要删除的值
		LTree p = (LTree)malloc(sizeof(Tree));
		if (T->Rch != NULL && T->Lch != NULL) { //同时存在左右两个结点
			p = FindMin(T->Lch);  //寻找右子树的最小结点
			T->data = p->data;  //付给当前结点
			T = Delete(T->Rch, T->data);  //将右子树中的对应的结点删除
			free(p); //释放空间
		}
		else if (T->Rch == NULL) { //只存在左子树或无子树时
			p = T;
			T = T->Lch;
			free(p);
		}
		else if (T->Lch == NULL) {//只存在右子树或无子树时
			p = T;
			T = T->Rch;
			free(p);
		}

	}
	return T;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值