二叉排序树的建立,删除

最近在复习数据结构,对于二叉排序树,看了一些书,参考别人的思想写出了这个代码,希望看到的人给点修改建议
代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct bitree
{
	int data;
	struct bitree *pLeft;
	struct bitree *pRight;
}Bitree;
typedef struct bitree * iBitree;

iBitree q;
int Searchtree(iBitree s,int dt,iBitree p)
{
	if(s == NULL)
	{
		q = p;
		return 0;
	}
	else 
	{
		if(s->data == dt)
		{
			q = p;
			return 1;
		}
		else if(dt < s->data)
			return Searchtree(s->pLeft,dt,s);
		else
			return Searchtree(s->pRight, dt,s);
	}
	
}
iBitree CreateBitree(iBitree s,int dt)
{
	iBitree p;
	if(!Searchtree( s, dt,NULL))
	{
		p = (iBitree)malloc(sizeof(Bitree));
		p->data = dt;
		p->pLeft=p->pRight=NULL;
		if(q==NULL)
			s=p;
		else
		{
			if(q->data > dt )
			{
				q->pLeft = p;
			}
			else
			{
				q->pRight = p;
			}
		}
	}
	return s;
}

iBitree Delete(iBitree s,int num)
{
	iBitree p,r,t;
	if(s->data == num)
	{
		if((s->pRight == NULL)&&(s->pLeft !=NULL))
		{
			p = s;
			s = s->pLeft;
			free(p);
		}
		else if((s->pRight != NULL)&&(s->pLeft ==NULL))
		{
			p = s;
			s = s->pRight;
			free(p);		
		}
		else
		{
			if((s->pRight == NULL)&&(s->pLeft ==NULL)) 
				free(s);
			else
			{
				r = s;
				p = s->pLeft;
				while(p->pRight != NULL)
				{
					p=p->pRight;
				}
				p->pRight = s->pRight;
				s = s->pLeft;
				free(r);
			}
		}
			
	}
	else
	{
		if(Searchtree(s, num, NULL))
		{
			if(q->pLeft->data == num)
			{
				p = q->pLeft;
				if((p->pRight == NULL)&&(p->pLeft !=NULL))
				{
					r = p;
					q->pLeft= p->pLeft;
					free(r);
				}
				else if((p->pRight != NULL)&&(p->pLeft ==NULL))
				{
					r = p;
					q->pLeft= p->pRight;
					free(r);
				}
				else
				{
					if((p->pRight == NULL)&&(p->pLeft ==NULL)) 
						free(r);
					else
					{
						r=p;
						t = p->pLeft;
						while(t->pRight != NULL)
						{
							t = t->pRight;
						}
						t->pRight = p->pRight;
						q->pLeft = p->pLeft;
						free(r);
					}
				}
			}
			else
			{
				p = q->pRight;
				if((p->pRight == NULL)&&(p->pLeft !=NULL))
				{
					r = p;
					q->pRight= p->pLeft;
					free(r);
				}
				else if((p->pRight != NULL)&&(p->pLeft ==NULL))
				{
					r = p;
					q->pRight= p->pRight;
					free(r);
				}
				else
				{
					if((p->pRight == NULL)&&(p->pLeft ==NULL)) 
						free(r);
					else
					{
						r=p;
						t = p->pLeft;
						while(t->pRight != NULL)
						{
							t = t->pRight;
						}
						t->pRight = p->pRight;
						q->pRight= p->pLeft;
						free(r);
					}
				}	
			}
		}
	}
	return s;
}
void inTrvel(iBitree s)
{
	iBitree q = s;
	if(q != NULL)
	{
		inTrvel(q->pLeft);
		printf("%d ",q->data);
		inTrvel(q->pRight);
	}
}
int main()
{
	int a[10] = {20,34,45,12,64,23,85,74,93,33};
	iBitree root = NULL;
	int i;
	for(i = 0; i< 10;i++)
	{
		root = CreateBitree(root,a[i]);
	}
	inTrvel(root);
	printf("\n");
	root = Delete(root, 45);
	inTrvel(root);
	printf("\n");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值