【模板】Splay二叉树排序

来源:互联网 发布:sim900a gprs接收数据 编辑:程序博客网 时间:2024/06/08 19:33

题目描述

排序(二叉树排序)

输入输出格式

输入格式:

n个数,和一个无序序列。

输出格式:

输出一行n个数字,表示原始序列排序后的结果

输入输出样例

输入样例#1:
5 3 5 2 1 4
输出样例#1:
1 2 3 4 5




说明

N,M<=100000



#include <iostream>#include <cstdio>using namespace std;struct splay_tree{int val,lef,rig,p;}a[1000000];int n,x,root=0,size=1;void left_rotate(int x){int y=a[x].p;a[x].p=a[y].p;if (a[x].p==0) root=x;if (y==a[a[y].p].lef) a[a[y].p].lef=x;    else a[a[y].p].rig=x;a[y].rig=a[x].lef;a[a[x].lef].p=y;a[y].p=x;a[x].lef=y;}void right_rotate(int x){int y=a[x].p;a[x].p=a[y].p;if (a[x].p==0) root=x;if (y==a[a[y].p].lef) a[a[y].p].lef=x;    else a[a[y].p].rig=x;a[y].lef=a[x].rig;a[a[x].rig].p=y;a[y].p=x;a[x].rig=y;}void splay(int x){while (x!=root) {int y=a[x].p;if (y==root&&x==a[y].lef){right_rotate(x);break;}elseif (y==root&&x==a[y].rig){left_rotate(x);break;}else{if (y==a[a[y].p].lef){    if (x==a[y].rig) {left_rotate(x);right_rotate(x);}if (x==a[y].lef) {right_rotate(y);right_rotate(x);}}elseif (y==a[a[y].p].rig){    if (x==a[y].lef) {    right_rotate(x);left_rotate(x);}if (x==a[y].rig) {left_rotate(y);left_rotate(x);}}}}}void st_insert(int va){int p=root,last=p;if (p==0){root=1;a[1].val=va;return ;}while (a[p].val!=0){last=p;if (a[p].val>va) p=a[p].lef;         else    p=a[p].rig;}++size;a[size].val=va;a[size].p=last;if (a[last].val>va) a[last].lef=size;              else  a[last].rig=size; splay(size);}void dfs(int x){if (x==0) return ;dfs(a[x].lef);cout <<a[x].val<<' ';dfs(a[x].rig);}int main(){scanf("%d",&n);int flag;for (int i=1;i<=n;++i){scanf("%d",&x);st_insert(x);}dfs(root);return 0;}


原创粉丝点击