本篇使用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;
}