数组二叉搜索树做法,全WA,求助!
查看原帖
数组二叉搜索树做法,全WA,求助!
1031191
Zhang_Wenfu楼主2024/6/26 12:48
#include <bits/stdc++.h>
using namespace std;
int q,op,x,cnt=1,c=0,k;

struct node{
	int data,l,r,size; //size为以node为根节点的树的大小
	node(int ll,int rr,int s,int v) : l(ll),r(rr),size(s),data(v) {}
	node() {}
}tree[10010];

void insert(int root,int x){ //插入
	if (x < tree[root].data){
		if (!tree[root].l) tree[tree[root].l = ++cnt]=node(0,0,1,x);
		else insert(tree[root].l,x); //左子树
	}
	else if (x > tree[root].data){
		if (!tree[root].r) tree[tree[root].r = ++cnt]=node(0,0,1,x);
		else insert(tree[root].r,x); //右子树
	}
	tree[root].size=tree[tree[root].l].size+tree[tree[root].r].size+1; //更新树的大小 
}

int find(int xx,int root){ //查询x的排名
	if (!tree[root].data) return 1;
	if (root){
		if (xx < tree[root].data) return find(xx,tree[root].l);
		else if (xx > tree[root].data) return find(xx,tree[root].r)+tree[tree[root].l].size+1;
		else return tree[tree[root].l].size+1;
	}
}

int findd(int xx,int root){ //查询排名为x的数
	if (!tree[root].data) return 0;
	if (root){
		if (xx <= tree[tree[root].l].size) findd(xx,tree[root].l);
		else if (xx > tree[tree[root].l].size+1) findd(xx-1-tree[tree[root].l].size,tree[root].r);
		else return tree[root].data;
	}
}

int main(){
	cin >> q;
	while (q--){
		cin >> op >> x;
		if (op == 1) cout << find(x,1) << endl;
		else if (op == 2) cout << findd(x,1) << endl;
		else if (op == 3){
			k=findd(find(x,1)-1,1);
			if (k) cout << k << endl;
			else cout << -2147483647 << endl;
		}
		else if (op == 4){
			k=findd(find(x,1)+1,1);
			if (k) cout << k << endl;
			else cout << 2147483647 << endl;
		}
		else if (op == 5){
			c++;
			if (c == 1){
				tree[1].data=x;
				tree[1].size=1;
			}else insert(1,x);
		}
	}
	return 0;
}
2024/6/26 12:48
加载中...