顺序排列的二叉树的删除

大家好我是新生小白,今日写了顺序排列的二叉树的删除,自己写的几个测试点进去都还行,不知道有没错误,如果哪里有错误的,或者代码少考虑了什么的可以在评论区提出!

以下是代码内容:

运行结果输出方式为中序遍历!

#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;

typedef struct bst{
	ElemType data;
	struct bst *lchild,*rchild;
}Node,*LinkBST;

Status inincreadLinkBST(LinkBST &T,ElemType data)//添加节点元素 
{
	LinkBST p=new Node;
	if(!p)
	return ERROR;
	p->data=data;
	p->lchild=p->rchild=NULL;
	T=p;
	return OK;
}

Status pushdata(LinkBST &T,ElemType data)//树插入元素 
{
	LinkBST p;
	if(T==NULL)
	{
	   inincreadLinkBST(T,data);
	   return OK;
    }
	else
	{
		p=T;
		if(p->data>data)
		pushdata(T->lchild,data);
		else if(p->data<data)
		pushdata(T->rchild,data);
		else if(p->data==data)
		return ERROR;
	}
}

void Delete(LinkBST &T,ElemType data,LinkBST &parents);//声明删除函数 

ElemType BST_lchild_max(LinkBST &T)//找树的左子树的最大节点返回元素值,并删除 
{
	LinkBST p=T->lchild,pre=T;
	ElemType nv;
	if(p!=NULL)
	while(p->rchild!=NULL)
	{
		pre=p;
		p=p->rchild;
	}
	nv=p->data;
	Delete(p,nv,pre);
	return nv;
}

void Delete(LinkBST &T,ElemType data,LinkBST &parents)//删除元素内容 
{
	LinkBST p=T,q=parents;
	ElemType nv;
	if(p->data==data)
	{
	    if(!p->lchild&&!p->rchild)
		{
			if(q==NULL)
			{
				T=NULL;
				delete p;
				return ;
			}
			else if(q->data>data)
			q->lchild=NULL;
			else
			q->rchild=NULL;
			return ;
		}
		else if(!p->lchild!=!p->rchild)
		{
			if(p->lchild)
			{
				if(q==NULL)
				T=T->lchild;
				else if(q->data>data)
				q->lchild=p->lchild;
				else
				q->rchild=p->lchild;
			}
			else
			{
				if(q==NULL)
				T=T->rchild;
				else if(q->data>data)
				q->lchild=p->rchild;
				else
				q->rchild=p->rchild;
			}
			delete p;
			return ;
		}
		else if(p->lchild&&p->rchild)
		{
			nv=BST_lchild_max(T);
			p->data=nv;
			return ;
		}
	}
	else
	{
		while(p->data!=data)
		{
			q=p;
			if(p->data>data)
			p=p->lchild;
			else
			p=p->rchild;
		}
		Delete(p,data,q);
	}
}

void pop(LinkBST T)
{
	LinkBST p=T;
	if(T==NULL)
	return;
	pop(p->lchild);
	cout<<p->data<<" ";
	pop(p->rchild);
}

Status look_data(LinkBST T,ElemType data)
{
	LinkBST p=T;
	if(p==NULL)
	return ERROR;
	do
	{
		if(p->data==data)
		return OK;
		else if(p->data>data)
		p=p->lchild;
		else
		p=p->rchild;
	}while(p->data!=data&&p!=NULL);
	return ERROR;
}

main()
{
	int n,i;
	ElemType data[MAXSIZE],e;
	LinkBST T=NULL,parents=NULL;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>data[i];
	}
	for(i=1;i<=n;i++)
	pushdata(T,data[i]);
	cout<<"请输入要删除的元素:"<<endl;
	cin>>e;
	if(look_data(T,e))
	Delete(T,e,parents);
	else
	cout<<"没有此元素!"<<endl;
	pop(T);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值