二叉查找树&&平衡树基础

9 篇文章 0 订阅
1 篇文章 0 订阅

操作:二叉查找树(插入,查找,删除,dfs序,求最值,第k大/小)


 
//二叉查找树 
//特点:每个点左子树上的点都小于该点,右子树上的点都大于该点 
//没有取值相同的点 任意点的左右子树均为二叉查找树 
//中序遍历严格单调递增 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
struct uio{
	int num,cnt,dfs;//num取值 cnt该取值个数 dfs为dfs序 
	int l,r;//左右子节点的编号 
}bst[1001];
int n,root,ccnt=1,midcnt,ans[1000];//root为最终父节点(根节点) ccnt为输入数据编号 midcnt为中序遍历编号 
void get(int x)//插入 
{
	ccnt++;
	int pre=0,now=1;
	while(now!=0)
	{
		if(x==bst[now].num)
		{
			bst[now].cnt++;
			return;
		}
		if(x<bst[now].num)
		{
			pre=now;
			now=bst[now].l;
		}
		if(x>bst[now].num)
		{
			pre=now;
			now=bst[now].r;
		}
	}
	bst[ccnt].num=x;
	bst[ccnt].cnt=1;
	if(x<bst[pre].num)
		bst[pre].l=ccnt;
	else
		bst[pre].r=ccnt;
}
int search(int x)//查找 
{
	int now=1;
	while(now!=0)
	{
		if(x==bst[now].num)
			return now;
		if(x<bst[now].num)
			now=bst[now].l;
		if(x>bst[now].num)
			now=bst[now].r;
	}
	return 0;
}
int getpre(int x) 
{
	int pre=0,now=1;
	while(now!=0)
	{
		if(x==bst[now].num)
			return pre;
		if(x<bst[now].num)
		{
			pre=now;
			now=bst[now].l;
		}
		if(x>bst[now].num)
		{
			pre=now;
			now=bst[now].r;
		}
	}
	return 0;
}
int getnxt(int x)
{
	if(bst[x].l==0)
		return x;
	return getnxt(bst[x].l);
}
void del(int x)//删除 
{
	int pre=getpre(x);
	int now=search(x);
	if(bst[now].num>1)
	{
		bst[now].num--;
		return;
	}
	if(bst[now].l==0&&bst[now].r==0)
	{
		if(bst[pre].l==now)
			bst[pre].l=0;
		else
			bst[pre].r=0;
	}
	if(bst[now].l!=0&&bst[now].r==0)
	{
		bst[pre].l=bst[now].l;
		if(bst[pre].r==now)
			bst[pre].r=0;
	}
	if(bst[now].l==0&&bst[now].r!=0)
	{
		bst[pre].r=bst[now].r;
		if(bst[pre].l==now)
			bst[pre].l=0;
	}
	if(bst[now].l!=0&&bst[now].r!=0)
	{
		int nxt=getnxt(now);
		swap(bst[now],bst[nxt]);
		del(bst[nxt].num);
	}
}
int getmin(int x)//找最小值 返回下标 
{
	int ans=0,now=1;
	while(now!=0)
	{
		if(bst[now].num<x)
		{
			ans=now;
			now=bst[now].r;
		}
		else
			now=bst[now].l;
	}
	return ans;
}
int getmax(int x)//找最大值 返回下标
{
	int ans=0,now=1;
	if(bst[now].num>x)
	{
		ans=now;
		now=bst[now].l;
	}
	else
		now=bst[now].r;
}
int dfsnummin(int x,int y)//dfs序(升序) x起始点编号 y记序 
{
	if(bst[x].l!=0)
		dfsnummin(bst[x].l,y+1);
	if(bst[x].r!=0)
		dfsnummin(bst[x].r,y+1);
	bst[x].dfs=y;
}
int getnokmin(int x,int k)//找第k小
{
	dfsnummin(1,1);
	int now=1;
	while(now!=0)
	{
		int lsize=0;
		int lson=bst[now].l;
		int rson=bst[now].r;
		if(lson!=0)
			lsize=bst[now].dfs;
		if(x<=lsize)//x在左子树 
			now=lson;
		else if(lsize+1<=k&&k<=lsize+bst[now].num)//x为当前节点 
			return now;
		else//x在右子树 
		{
			x-=lsize+bst[now].num;
			now=rson; 
		}	
	}
	return 0;
}
int dfsnummax(int x,int y)//dfs序(降序) x起始点编号 y记序 
{
	if(bst[x].l!=0)
		dfsnummax(bst[x].l,y-1);
	if(bst[x].r!=0)
		dfsnummax(bst[x].r,y-1);
	bst[x].dfs=y;
}
int getnokmax(int x,int k)//找第k大 
{
	dfsnummax(1,n);
	int now=1;
	while(now!=0)
	{
		int rsize=0;
		int lson=bst[now].l;
		int rson=bst[now].r;
		if(rson!=0)
			rsize=bst[now].dfs;
		if(x<=rsize)//x在右子树 
			now=rson;
		else if(rsize+1<=k&&k<=rsize+bst[now].num)//x为当前节点 
			return now;
		else//x在左子树 
		{
			x-=rsize+bst[now].num;
			now=rson; 
		}	
	}
	return 0;
}
void do_something()
{
	return;
}
int main()
{
	cin>>n>>root;
	bst[1].num=root;
	bst[1].cnt=1;
	for(int i=1;i<=n;i++)
	{
		int v=0;
		cin>>v;
		get(v);
	}
	do_something(); 
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的体育馆管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此体育馆管理系统利用当下成熟完善的SpringBoot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理收货地址管理、购物车管理、场地管理、场地订单管理、字典管理、赛事管理、赛事收藏管理、赛事评价管理、赛事订单管理、商品管理、商品收藏管理、商品评价管理、商品订单管理、用户管理、管理员管理等功能。体育馆管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:体育馆管理系统;SpringBoot框架;Mysql;自动化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值