二叉排序树

数据结构课的作业:实现二叉排序树的创建,插入,删除。

检验二叉排序树正不正确,就需要中序输出。如果是升序就证明无错。

对删除操作有点晕就搜集了一下

 二叉排序树的删除:
  
假设被删结点是*p,其双亲是*f,不失一般性,设*p是*f的左孩子,下面分三种情况讨论:
⑴ 若结点*p是叶子结点,则只需修改其双亲结点*f的指针即可。
⑵ 若结点*p只有左子树PL或者只有右子树PR,则只要使PL或PR 成为其双亲结点的左子树即可。
⑶ 若结点*p的左、右子树均非空,先找到*p的中序前趋结点*s(注意*s是*p的左子树中的最右下的结点,它的右链域为空),然后有两种做法:
① 令*p的左子树直接链到*p的双亲结点*f的左链上,而*p的右子树链到*p的中序前趋结点*s的右链上。
② 以*p的中序前趋结点*s代替*p(即把*s的数据复制到*p中),将*s的左子树链到*s的双亲结点*q的左(或右)链上。

代码如下:

#include <stdio.h>
#include<stdlib.h>
typedef int ElemType;
#define INF -123456
struct BSTree{
	ElemType data;
	BSTree *lchild;
	BSTree *rchild;
};
void InserBSTree(BSTree **bst,ElemType v)//插入值,用了二级指针
{
	BSTree *s;
	if(*bst==NULL)
	{
		s=(BSTree *)malloc(sizeof(BSTree));
		s->data=v;s->lchild=NULL;s->rchild=NULL;
		*bst=s;
	}
	else if((*bst)->data>v)
		InserBSTree(&((*bst)->lchild),v);
	else InserBSTree(&((*bst)->rchild),v);
}
BSTree *CreateBSTree()
{
	ElemType value;
	BSTree *root=NULL;
	printf("输入值 直到输入-123456结束\n");
	scanf("%d",&value);
	while(value!=INF)
	{
		InserBSTree(&root,value);
		scanf("%d",&value);
	}
	return root;
}
BSTree *SearchBSTree(BSTree *bst,ElemType v)//搜索值,返回节点指针
{
	if(bst==NULL)
		return NULL;
	else if(bst->data==v)
		return bst;
	else if(bst->data>v)
		return SearchBSTree(bst->lchild,v);
	else return SearchBSTree(bst->rchild,v);
}
void DelBSTree(BSTree *root)
{
	BSTree *p=root;
	BSTree *f=NULL,*q,*s;
	int value;
	printf("输入你想删除的值\n");
	scanf("%d",&value);
	while(p)
	{
		if(p->data==value)
			break;
		f=p;
		if(p->data>value)
			p=p->lchild;
		else p=p->rchild;
	}
	if(p==NULL)
		{printf("Not found\n");return;}
	if(p->lchild==NULL)
	{
		if(f->lchild==p)
			f->lchild=p->rchild;
		else f->rchild=p->rchild;
		free(p);
	}
	else
	{
		q=p;s=p->lchild;
		while(s->rchild)
		{q=s;s=s->rchild;}
	    if(q==p)
	    	q->lchild=s->lchild;
	    else q->rchild=s->lchild;
	    p->data=s->data;
	    free(s);
	}
}
void Middispprint(BSTree *root)//中序输出验证
{
	if(root!=NULL)
	{
		Middispprint(root->lchild);
		printf("%d ",root->data);
		Middispprint(root->rchild);
	}
}
int main()
{
	ElemType value;
	BSTree *pt;
	BSTree *root;
	root=CreateBSTree();
	printf("Enter the value which you want search.");
	scanf("%d",&value);
	pt=SearchBSTree(root,value);
	if(pt==NULL)
		printf("Not found\n");
	else printf("Yes\n");
	DelBSTree(root);
	Middispprint(root);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值