二叉排序树的 插入 删除 遍历

本文详细介绍了二叉排序树的基本概念,并重点讲解了如何进行插入、删除操作,以及如何实现中序遍历,帮助读者深入理解二叉排序树的数据结构及其应用。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <stdlib.h>
#define True      1
#define False      0
typedef struct  BiTNode       //定义二叉树节点结构
{int  data;                  //为了方便,数据域只有关键字一项
struct BiTNode *lchild,*rchild; //左右孩子指针域
}BiTNode,*BiTree;

typedef int keytype;
typedef  struct
{  keytype  key;
}ElemType;


int SearchBST(BiTree T,int key,BiTree f,BiTree &p)
{//在根指针T所指二叉排序树中递归的查找其关键字等于key的元素,若查找成功
	//则指针p指向该数据元素,并返回True,否则指针指向查找路径上访问的最后一
	//个结点并返回False,指针f指向T的双亲,其初始调用值为NULL

	if(!T) 
	{
		p=f;
		return False;
	}  //查找不成功
	else if(key==T->data) 
	{
		p=T;
		return True;
	} //查找成功
	else if(key<T->data) 
		return SearchBST(T->lchild,key,T,p); //在左子树中继续查找
	else 
		return SearchBST(T->rchild,key,T,p); //在右子树中继续查找
}
int InsertBST(BiTree &T,int e)
{//当二叉排序树T中不存在元素e时,插入e并返回True,否则返回False
	BiTree p,s;
	if(!SearchBST(T,e,NULL,p)) //查找不成功
	{
		s=(BiTree)malloc(sizeof(BiTNode));
		s->data=e;
		s->lchild=s->rchild=NULL;
		if(!p) T=s;         //被插结点*s为新的根结点
		else 
			if(e<p->data) 
				p->lchild=s; //被插结点*s为左孩子
			else 
				p->rchild=s;   //被插结点*s为右孩子
		return True;  //成功插入
	}
	else return False; //树中已存在关键字为e的数据元素
}

void CreateBST(BiTree& T)
{
	int key=1;
	int flag;
	T=NULL;
	printf("创建一个二叉排序树,输入数据(以0结束):");
	while(key)
	{   
		printf("\n请输入数据: ");
		scanf("%d",&key);
		if(!key)continue;
		flag=InsertBST(T,key);
		if(!flag) 
			printf("%d 该元素已经存在!\n",key); //该元素已经存在
	}
}
void Delete(BiTree &p)
{//在二叉排序树中删除结点p,并重接它的左或右子树
	BiTree s,q;
	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->rchild; //重接*q的右子树
	else q->lchild=s->lchild;     //重接*q的左子树
	free(s);
	}
}
int DeleteBST(BiTree &T,int key)
{//若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点
	//并返回True,否则返回False
	if(!T) return False;  //不存在关键字等于key的数据元素
	else
	{if(key==T->data) 
	{
		Delete(T);
		return True;
	} 
	//找到关键字等于key的数据元素并删除它
	else if(key<T->data) 
		return DeleteBST(T->lchild,key); //继续在左子树中删除
	else return DeleteBST(T->rchild,key);   //继续在右子树中删除
	}
}
void InorderBST(BiTree T)
{//以中序方式遍历二叉排序树T,即从小到大显示二叉排序树的所有元素
	if(T->lchild) 
		InorderBST(T->lchild);
	printf("%d  ",T->data);
	if(T->rchild) 
		InorderBST(T->rchild);
}


void menu()
{
	printf("|           1:创建一颗二叉排序树T  |\n");
	printf("|                                  |\n");
	printf("|           2:输出二叉排序树T      |\n");
	printf("|                                  |\n");
	printf("|           3:在T中查找某个元素    |\n");
	printf("|                                  |\n");
	printf("|           4:二叉排序树的插入     |\n");
	printf("|                                  |\n");
	printf("|           5:二叉排序树的删除     |\n");
	printf("|                                  |\n");
	printf("|           0:退出菜单             |\n");
}//menu
void main()
{BiTree T,p;
int x,keyword;
int temp;
T=NULL;
int exitflag=0;
while(! exitflag)
{
	menu();
	scanf(" %d",&x); //输入操作选项
	switch(x)
	{
	case 1:
		CreateBST(T);
		system("cls");
		break;
	case 2:
		system("cls"); 
		if(!T) 
			printf("这不是二叉排序树.\n");
		else 
		{
			InorderBST(T);
			printf("\n"); }
		break;
	case 3:
		system("cls");
		printf("这颗二叉排序为:\n");
		InorderBST(T);
		printf("\n");
		printf("输入要查找元素的关键字:");
		scanf(" %d",&keyword); //输入要查找元素的关键字
		temp=SearchBST(T,keyword,NULL,p);
		if(!temp) 
			printf("%d 没有找到!\n",keyword); //没有找到
		else 
			printf("%d 成功找到!\n",keyword); //成功找到
		break;
	case 4:
		system("cls");
		printf("Now ,the BST tree is:\n");
		InorderBST(T);
		printf("\n输入要插入元素的关键字:");
		scanf(" %d",&keyword); //输入要插入元素的关键字
		temp=InsertBST(T,keyword);
		if(!temp) 
			printf("%d该元素已经存在!\n",keyword); //该元素已经存在
		else 
			printf("成功插入 %d!\n",keyword); //成功插入
		printf("成功插入后的二叉排序树为:\n");
		InorderBST(T);
		printf("\n");
		break;
	case 5:
		system("cls");
		printf("这颗二叉排序树为:\n");
		InorderBST(T);
		printf("\n输入要删除元素的关键字:");
		scanf(" %d",&keyword); //输入要删除元素的关键字
		temp=DeleteBST(T,keyword);
		if(!temp) printf("%d 该元素不存在!\n",keyword); //该元素不存在
		else printf("成功删除 %d!\n",keyword); //成功删除
		printf("删除后的二叉排序树为:\n");
		InorderBST(T);
		printf("\n");
		break;
	case 0:exitflag=1; break;
	default:
		printf("输入错误,请重新输入!\n");
	}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值