样例过了,但是全WA,用BST写的,求助哪里错了!
查看原帖
样例过了,但是全WA,用BST写的,求助哪里错了!
237570
hy1089knigh楼主2020/12/31 17:03
#include<iostream>
#include<cstdio>
using namespace std;

int n,sum;//sum是二叉搜索树结点编号 

struct node{
	int l,r,val,size,cnt;
}a[10005];

int rank(int x,int root)//查询x的排名
{
	if(root==0) return 1;
	if(x<a[root].val)//去左子树找 
	{
		return rank(x,a[root].l);
	}
	else if(x>a[root].val)//去右子树找
	{
		return a[root].cnt+a[a[root].l].size+rank(x,a[root].r);
	} 
	else
	{
		return a[a[root].l].size+1;
	}
}

int rankx(int x,int root)//查询排名为x的数
{
	if(x<1)
		return -2147483647;
	if(x>a[1].size)
		return 2147483647;
	if(x<=a[a[root].l].size)//在左子树中 
	{
		return rankx(x,a[root].l);
	}
	else if(x<=a[a[root].l].size+a[root].cnt)
	//是根
	{
		return a[root].val;
	}
	else//在右子树中 
	{
		return rankx(x-a[a[root].l].size-a[root].cnt,a[root].r);
	} 
}

void insert(int x,int root)//插入一个数x
{
	if(x<a[root].val)//插到左子树 
	{
		if(a[root].l==0)//左儿子不存在 
		{
			a[root].l=++sum;
			a[sum].val=x;
			a[sum].r=0;
			a[sum].size=1;
			a[sum].cnt=1;
		}
		else//左儿子存在
		{
			insert(x,a[root].l);
		}
	}
	else if(x>a[root].val)
	{
		if(a[root].r==0)//右儿子不存在 
		{
			a[root].r=++sum;
			a[sum].val=x;
			a[sum].l=0;
			a[sum].r=0;
			a[sum].size=1;
			a[sum].cnt=1;
		}
		else//右儿子存在
		{
			insert(x,a[root].r);
		}		
	}
	else//x是根结点,cnt+1 
	{
		a[root].cnt++;
	}
	a[root].size++;
}

int main()
{
	int opt,x;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d%d",&opt,&x);
		switch(opt)
		{
			case 1://查询x的排名
				printf("%d\n",rank(x,1));break;
			case 2://查询排名为x的数
				printf("%d\n",rankx(x,1));break;
			case 3://求x的前驱
				printf("%d\n",rankx(rank(x,1)-1,1));break;
			case 4://求x的后继
				printf("%d\n",rankx(rank(x,1)+1,1));break;
			case 5://插入一个数x
				if(sum==0)
				{
					sum++;
					a[sum].l=0;
					a[sum].r=0;
					a[sum].val=x;
					a[sum].cnt=1;
					a[sum].size=1;						
				}
				else	
					insert(x,1);
		}
	}
	return 0;
}
2020/12/31 17:03
加载中...