【C++】二叉排序树

本实验完成二叉排序树中基本操作的实现,二叉排序树中的记录关键字类型为int
请实现下面三个操作:

  1. 在二叉排序树中插入一个关键字为e.key的新结点
  2. 在二叉排序树中,查找关键字为key的结点
  3. 在二叉排序树中删除p所指结点
#include <iostream>
using namespace std;

//数据元素类型ElemType定义
typedef struct{
	int key;           //关键字域
	char *otherinfo;   //其它域
}ElemType;

//二叉链表结构定义
typedef struct BSTNode{
	ElemType data;                    //数据域
	struct BSTNode *lchild,*rchild;   //左右指针域
}BSTNode,*BSTree;


//在二叉排序树T中插入一个关键字为e.key的新结点
void InsertBST(BSTree &T,ElemType e)
{
	//请同学们将该操作补充完整
		BSTree p=new BSTNode;
		p->data=e;
		p->lchild=NULL;
		p->rchild=NULL;
	if(T==NULL){
		T=p;
	}
	else if(e.key<=T->data.key){
		InsertBST(T->lchild,e);
	}
	else{
		InsertBST(T->rchild,e);
	}


}

//创建二叉排序树T
void CreateBST(BSTree &T)
{
	ElemType e;
	T=NULL;               //初始时,二叉排序树T为空树
	cout<<"请输入各结点关键字值,以-1为结束标志"<<endl;
	cin>>e.key ;
	while(e.key !=-1)     //逐一将新结点插入到二叉排序树T中
	{
		InsertBST(T,e);   
		cin>>e.key ;
	}	
}

//按中序遍历序列输出各结点关键字值
void InorderBST(BSTree T)
{
	if(T)
	{
		InorderBST(T->lchild);
		cout<<T->data .key <<"  ";
		InorderBST(T->rchild );
	}
}


//在二叉排序树T中,查找关键字为key的结点,若查找成功,返回该结点地址,否则,返回空指针
BSTree SearchBST(BSTree T,int key)
{
	//请同学们将该操作补充完整
	if((!T)||T->data.key==key) return T;
	else if(key<T->data.key) return SearchBST(T->lchild,key);
	else if(key>T->data.key) return SearchBST(T->rchild,key);
	//补充完该部分操作后,将改行删除
} 



//在二叉排序树T中删除p所指结点,f为p的双亲
void Delete(BSTree &T,BSTNode *p,BSTNode *f)
{
	BSTNode *q,*s;
	q=p;
	if(p->rchild  && p->lchild )   //p所指结点的左右子树均非空
	{
		//请同学们补充此部分操作
		s=p->lchild;
		while(s->rchild){
			q=s;
			s=s->rchild;
		}
		p->data=s->data;
		if(q!=p) q->rchild=s->lchild;
		else q->lchild=s->lchild;
		delete s;
		return;
	}
	else if(p->rchild ==NULL)   //p所指结点只有左子树
	{
		//请同学们补充此部分操作
		p=p->lchild;
	}
	else if(p->lchild ==NULL)   //p所指结点只有右子树
	{
		//请同学们补充此部分操作
		p=p->rchild;
	}
	if(f==NULL) T=NULL;    //T只有一个根结点,且被删除的是根结点
	else if(q==f->lchild )  f->lchild =p;   //被删结点是双亲f的左孩子
	else   f->rchild =p;    //被删结点是双亲f的右孩子
	delete q;    //释放被删结点
}


//删除二叉排序树T中关键字等于key的结点,删除成功,返回true,删除失败,返回false
bool DeleteBST(BSTree &T,int key)
{
	BSTNode *p=T,*f=NULL;    
	while(p)     //从二叉排序树的根开始,查找关键字为key的结点,并用p指向它,f指向p的双亲
	{
		if(p->data .key ==key)     //找到关键字为key的结点,且p指向它
			break;
		f=p;                       //f为p的双亲
		if(p->data .key >key)      //在p的左子树中继续查找
			p=p->lchild ;
		else                       //在p的右子树中继续查找
			p=p->rchild ;
	}
	if(p==NULL)            //T中不存在关键字等于key的结点,返回false
		return false;
	Delete(T,p,f);         //在二叉排序树T中删除p所指结点(关键字为key的结点),f指向p的双亲
	return true;           //删除成功,返回true
}

int main()
{

	BSTree T;
	int key;

	CreateBST(T);         //创建二叉排序树
	cout<<"二叉排序树的中序遍历序列为:"<<endl;
	InorderBST(T);       //输出二叉排序树的中序遍历序列
	cout<<endl;
	
	cout<<"请输入要查找的关键字的值:";
	cin>>key;
	if(SearchBST(T,key)==NULL)       //在二叉排序树T中查找关键字为key的结点,并输出查找结果
		cout<<"查找失败,二叉排序树中不存在值为"<<key<<"的结点"<<endl;
	else
		cout<<"查找成功!"<<endl;

	cout<<"请输入要删除的关键字的值:";
	cin>>key;
	if(DeleteBST(T,key)==false)    //在二叉排序树T中删除关键字为key的结点,并输出删除结果
		cout<<"删除失败,二叉排序树中不存在值为"<<key<<"的结点"<<endl;
	else
	{
		cout<<"删除成功!二叉排序树的中序遍历结果为:"<<endl;
		InorderBST(T);
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cout0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值