顺序排列的二叉树的删除

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

以下是代码内容:

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

#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. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 23:02:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 23:02:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 23:02:02       87 阅读
  4. Python语言-面向对象

    2024-04-27 23:02:02       96 阅读

热门阅读

  1. 如何用代码制作一个想要的网站?

    2024-04-27 23:02:02       37 阅读
  2. 状态模式:管理状态转换的策略

    2024-04-27 23:02:02       39 阅读
  3. 请求头headers中的信息

    2024-04-27 23:02:02       35 阅读
  4. SpringBoot的核心内容之自动装配

    2024-04-27 23:02:02       34 阅读
  5. C# 学习笔记

    2024-04-27 23:02:02       32 阅读
  6. C# Solidworks二次开发:枚举应用实战(第六讲)

    2024-04-27 23:02:02       30 阅读
  7. centOS7.9| 无root安装 openssl 1.1.1

    2024-04-27 23:02:02       30 阅读
  8. Python中的进制转换函数详解

    2024-04-27 23:02:02       37 阅读