题意:构建一棵笛卡尔树,中序输出
思路:先按坐标排序,一个个插入。笛卡尔树原理和构造方法,这里忽略。留一下模板
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<list>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#include<numeric>
#include<functional>
using namespace std;
typedef long long ll;
const int maxn = 5e4+5;
struct data
{
int val;
char s[105];
}no[maxn];
struct Node
{
char s[105];
int val;
int l,r,fa;
}node[maxn];
int cnt;
int st[maxn],top;
int cmp(const data &x, const data &y)
{
return strcmp(x.s,y.s) < 0;
}
void init()
{
cnt = 1;
top = -1;
}
int fu(int x)
{
node[cnt].fa = 0;
node[cnt].l = 0;
node[cnt].r = 0;
strcpy(node[cnt].s,no[x].s);
node[cnt].val = no[x].val;
}
void add(int z)
{
fu(z);
if(top < 0) //第一个元素
{
st[++top] = cnt;
cnt++;
return;
}
while(top >= 0 && node[ st[top] ].val < node[cnt].val) //小的val出栈
top--;
if(top >= 0) //把上一个节点的右子树,挂到cnt的左子树
{
int x = st[top];
int y = node[x].r;
node[cnt].l = y;
node[y].fa = cnt;
node[x].r = cnt;
node[cnt].fa = x;
}
else //现在cnt的val最大,作为根
{
node[st[0]].fa = cnt;
node[cnt].l = st[0];
}
st[++top] = cnt;
cnt++;
} //l,r,fa 指向0,即没有点
int pr(int x)
{
putchar('(');
if(node[x].l)
pr(node[x].l);
printf("%s/%d",node[x].s,node[x].val);
if(node[x].r)
pr(node[x].r);
putchar(')');
}
int main(void)
{
int n;
while(scanf("%d",&n) && n)
{
init();
for(int i = 1; i <= n; i++)
scanf(" %[a-z]/%d",no[i].s,&no[i].val);
sort(no+1,no+1+n,cmp);
for(int i = 1; i <= n; i++)
add(i);
pr(st[0]);
putchar('\n');
}
return 0;
}