#include <stdlib.h>
#include <stdio.h>
typedef struct{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int search(BiTree T,int key,BiTree f,BiTree *p){
if(!T){
*p = f;
return 0;
}else if(T->data==key){
*p = T;
return 1;
}else if(T->data>key){
return search(T->lchild, key, T, p);
}else{
return search(T->rchild, key, T, p);
}
}
int Insert(BiTree *T,int key){
BiTree p =NULL;
if(!search(*T, key, NULL, &p)){
BiTree s = (BiTree)malloc(sizeof(BiTNode));
s->data = key;
s->lchild = NULL;
s->rchild = NULL;
if(!p){
*T = s;
}else if(key<p->data){
p->lchild = s;
}else{
p->rchild = s;
}
return 1;//插入成功
}
return 0;//查找成功便不需要插入
}
BiTree FindParent(BiTree T,BiTree child){
if(T==NULL){
return NULL;
}
if(T->lchild==child||T->rchild==child){
return T;
}
BiTree left = FindParent(T->lchild, child);
if(left){
return left;
}
BiTree right = FindParent(T->rchild, child);
if(right){
return right;
}
return NULL;
}
void delete(BiTree *T,int key){
if(*T==NULL){
exit(-1);
}
BiTree p,q,s,f;
f = NULL;
if(search(*T, key, NULL, &p)){
if(p->lchild==NULL&&p->rchild!=NULL){
//右孩子存在,左孩子不存在
q = p->rchild;
p->data = q->data;
p->rchild = q->rchild;
p->lchild = q->lchild;
free(q);
}else if (p->lchild!=NULL&&p->rchild==NULL){
//左孩子不空右孩子空
q = p->lchild;
p->data = q->data;
p->lchild = q->lchild;
p->rchild = q->rchild;
free(q);
}else if(p->lchild!=NULL&&p->rchild!=NULL){
//s寻找p左子树的最右边节点
q = p;
s = p->lchild;
while(s->rchild){
q = s;
s = s->rchild;
}
p->data = s->data;
if(p!=q){
q->rchild = s->lchild;
}else{
q->lchild = s->lchild;
}
free(s);
}else{
//此处似乎不能直接free掉p;
if(*T==p){
free(p);
*T = NULL;
return;
}
BiTree parent = FindParent(*T, p);
if(parent->lchild==p){
parent->lchild = NULL;
}else{
parent->rchild = NULL;
}
free(p);
}
}
}
void Inorder(BiTree T){
BiTree p;
BiTNode s[100];
int top = 0;
p = T;
while(top!=0||p!=NULL){
while(p!=NULL){
s[top++] = *p;
p = p->lchild;
}
if(top>0){
p = &s[--top];
printf("%d\t",p->data);
p = p->rchild;
}
}
}
int main(void){
int i;
int a[5] = {3,4,2,5,9};
int key;
BiTree T = NULL;
for (i = 0; i < 5; i++) {
Insert(&T, a[i]);
}
printf("中序遍历二叉排序树:\n");
Inorder(T);
printf("\n");
printf("请输入要删除的元素:");
scanf("%d",&key);
printf("删除%d后,中序遍历二叉排序树:\n",key);
delete(&T, key);
Inorder(T);
}
二叉排序树的查找、插入、删除、中序遍历(C语言)
最新推荐文章于 2023-05-25 12:06:43 发布