C语言实现二叉排序树

#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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值