专栏文章

平衡树

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mios50ip
此快照首次捕获于
2025/12/03 00:15
3 个月前
此快照最后确认于
2025/12/03 00:15
3 个月前
查看原文
CPP
#include<bits/stdc++.h>
using namespace std;
int cnt=1;
struct tree{
	int num,left,head,right,t;
};
tree a[10000];
void find(int p,int q){
	if(a[p].num>=a[q].num){
		if(a[p].left==0){
			a[p].left=q;
			a[q].head=p;
		}
		else find(a[p].left,q);
		if(a[p].t>a[a[p].left].t){
			a[a[p].left].head=a[p].head;
			if(a[a[p].head].left==p) a[a[p].head].left=a[p].left;
			else a[a[p].head].right=a[p].left;
			a[p].head=a[p].left;
			a[p].left=a[a[p].head].right;
			a[a[p].head].right=p;
		}
	}
	else{
		if(a[p].right==0){
			a[p].right=q;
			a[q].head=p;
		}
		else find(a[p].right,q);
		if(a[p].t>a[a[p].right].t){
			a[a[p].right].head=a[p].head;
			if(a[a[p].head].left==p) a[a[p].head].left=a[p].right;
			else a[a[p].head].right=a[p].right;
			a[p].head=a[p].right;
			a[p].right=a[a[p].head].left;
			a[a[p].head].left=p;
		}
	}
	
}
void prt(int p){
	if(a[p].left>0) prt(a[p].left);
	cout<<a[p].num<<" ";
	if(a[p].right>0) prt(a[p].right);
}
int main(){
	int n,h,i,j,k;
	cin>>n>>h;
	a[1].head=1;
	a[1].num=h;
	a[cnt].left=0;
	a[cnt].right=0;
	a[cnt].t=-1;
	for(i=1;i<n;i++){
		cnt++;
		cin>>a[cnt].num;
		a[cnt].left=0;
	    a[cnt].right=0;
	    a[cnt].t=rand()%1000;
		find(1,cnt);
	}
	prt(1);
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...