#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define FLASE 0
#define TRUE 1
#define EQ(a,b) ((a) == (b))
#define LT(a,b) ((a) < (b))
#define LQ(a,b) ((a) <= (b))
typedef int status;
typedef int KeyType;
typedef struct BitNode{
int data;
BitNode *lchild,*rchild;
}BitNode,*BiTree;
BiTree search(BiTree T, KeyType key) {
//在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素
//若查找成功,则返回指向该数据元素结点的指针,否者返回空指针
if (!T || EQ(key, T->data)) return T; //查找结束
else if (LT(key, T->data)) return (search(T->lchild, key)); //在左子树查找
else return search(T->rchild, key); //在右子树朝赵
}
status searchBST(BiTree T, KeyType key, BiTree f, BiTree &p) {
if (!T) {
p = f;
return FLASE; //查找不成功
} else {
if (key == T->data){
p = T;
return TRUE; //查找成功
} else if (LT(key, T->data)) {
return searchBST(T->lchild, key, T, p); //在左子树中查找
} else {
return searchBST(T->rchild, key, T, p); //在右子树中查找
}
}
}
status insertBST(BitNode *(&T), int e) {
//当二叉排序树T中不存在关键字等于等于e时,插入e并返回TRUE;
//否则返回FLASE
BiTree p;
if (!searchBST(T, e, NULL, p)) { //查找不成功
BiTree s = (BiTree)malloc(sizeof(BitNode));
s->data = e;
s->lchild = s->rchild = NULL;
if(!p) //被插结点*s为新的根节点
T = s;
else if LT(e, p->data) p->lchild = s; //被插结点为左孩子
else p->rchild = s; //被插结点为右孩子
return TRUE;
}
else return FLASE; //树中已有关键字
}
BiTree creater(int *arr, int len) { //创建
BiTree T = NULL;
int i;
for (i=0; i<len; i++) {
insertBST(T, arr[i]);
}
return T;
}
status Delete(BiTree &p) {
//从二叉树中删除结点p,并重接它的左或右子树
BiTree q, s;if (!p->rchild) { //右子树空则只需重接它的左子树
q = p;
p = p->lchild;
free(q);
} else if (!p->lchild) { //只需重接它的右子树
q = p;
p = p->rchild;
free(q);
} else { //左右都不空
q = p;
s = p->lchild;
while (s->rchild) { //转左,然后向右到尽头
q = s;
s = s->rchild;
}
p->data = s->data; //s指向被删结点的前驱
if (q != p) q->rchild = s->lchild; //重接*q的右子树
else q->lchild = s->lchild; //重接*q的左子树
delete s;
}
return TRUE;
}
status DeleteBST(BiTree &T, KeyType key) {
//若二叉排序树T中存在关键字key,则删除该数据的结点
if (!T) return FLASE; //不存在else
{
if (EQ(key, T->data))
return Delete(T); //找到关键字等于key的数据元素
else if(LT(key, T->data))
return DeleteBST(T->lchild, key);
else
return DeleteBST(T->rchild, key);
}
}
void traverse(BiTree T) { //输出函数
if (T) {
if(T->lchild)
traverse(T->lchild);
printf("%d ",T->data);
if(T->rchild)
traverse(T->rchild);
}
}
int main() {
int i;
int num;
printf ("请输入结点数:\n");
scanf ("%d", &num);
int *arr = (int *)malloc(num*sizeof(int));
printf ("请依次输入所有结点:\n");
for (i=0; i<num; i++) {
scanf ("%d", arr+i);
}
BiTree T = creater(arr, num);
printf ("中序遍历二叉排序树的结果:\n");
traverse(T);
printf ("\n");
int key;
printf("请输入要查找的整数:");
scanf("%d",&key);
if(search(T,key))
printf("查找成功\n");
else
printf("查找不到该整数\n");
printf("请输入要插入的整数:");
scanf("%d",&key);
if(insertBST(T,key)){
printf("插入成功,插入后的中序遍历结果:");
traverse(T);printf("\n");
}
else
printf("插入失败,该二叉排序树中已经存在整数%d\n",key);
printf("请输入要删除的整数:");
scanf("%d",&key);
if(DeleteBST(T,key)){
printf("删除成功,插入后的中序遍历结果:");
traverse(T);
printf("\n");
}else
printf("删除失败,该二叉排序树中不存在整数%d\n",key);
return 0;
}
C语言实现二叉排序树
最新推荐文章于 2023-06-30 23:38:50 发布