BST二叉查找树

#include<iostream>
using namespace std;
typedef struct node
{
	int data;
	struct node* lchild;
	struct node* rchild;
}NODE;
//注:平均深度 O(log N)
void Insert(NODE *&p, int x)
{
	if (p == NULL)
	{
		p = (NODE*)malloc(sizeof(NODE));
		p->data = x;
		p->lchild  = NULL;
		p->rchild = NULL;
	}
	else 
	{
		if (x < p->data)
			Insert(p->lchild, x);
		else
			Insert(p->rchild, x);
	}
}
NODE *Create(NODE *p,int a[],int n)//建立方法只需要插入一系列的值即可
{
	for (int i = 0; i < n; i++)
		Insert(p, a[i]);
	return p;
}

void Print(NODE *p)
{//通过中序输出得到的是递增有序的数
	if (p!=NULL)
	{	
		Print(p->lchild);
		cout << p->data;
		Print(p->rchild);
	}
}
NODE *FindMin(NODE *p)//查找最小的点
{
	if (p == NULL)
		return NULL;
	if (p->lchild == NULL)
		return p;
	else
		return FindMin(p->lchild); //由于左子树永远小于右子树,所以只需要遍历左边的
}
NODE* Del(NODE *p, int x)
{//删除有三种情况:1)没有子节点 2)有一个子节点 3)有两个子节点

	if (p == NULL)
		return NULL;
	else
	{
		if (x < p->data)
			p->lchild=Del(p->lchild, x);
		else if (x > p->data)
			p->rchild=Del(p->rchild, x);
		else if (p->data == x)
		{
			NODE *temp = p;
			if (p->lchild == NULL&&p->rchild == NULL)
			{	//如果左右节点均不存在,则直接删除
				free(p);
				p = NULL;
			}
			//若存在一个子节点,则把子节点的地址赋值给删除的那块节点
			else if (p->lchild != NULL&&p->rchild == NULL)
			{
				p = p->lchild;
				free(temp);
			}
			else if (p->lchild == NULL&&p->rchild != NULL)
			{
				p = p->rchild;
				free(temp);
			}
			else if (p->lchild != NULL&&p->rchild != NULL)
			{
				//如果左右节点都存在,则找到右子树中最小的节点并代替它
				temp = FindMin(p->rchild);
				p->data = temp->data;
				p->rchild=Del(p->rchild, p->data);
			}
		}

	}
	return p;
}
int main(void)
{
	NODE*a=(NODE*)malloc(sizeof(NODE));
	a = NULL;
	int n[6] = { 3,4,1,6,5,2 };
	a=Create(a,n,6); //将n数组中的值依次插入
	
	Del(a, 5);
	Print(a);

	system("pause");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值