POJ1785 (笛卡尔树的中序遍历)
这是接着我之前写的笛卡尔树来的,有兴趣的话可以看看哈,传送门https://blog.csdn.net/qq_33437973/article/details/97619600
这道题一开始没怎么懂,后来发现括号就是每个节点进行遍历开始的时候和结束的时候分别括上就行了,然后就是一个裸的笛卡尔树,MD还想了那么久!!!!
题目:http://poj.org/problem?id=1785
上代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
const int maxn=5e4+7;
using namespace std;
int n,ls[maxn<<1],rs[maxn<<1];
struct Node{
char name[101];
int priority;
int id;
bool operator <(const Node a) const{
return strcmp(a.name,name)>0;
}
}node[maxn<<1],ans[maxn<<1];
void build(){
stack <Node> ST;
for(int i=1;i<=n;i++){
Node sp=node[i],sq;
int flag=0;
while(!ST.empty() && ST.top().priority<sp.priority){
sq=ST.top();
ST.pop();
flag=1;
}
if(flag)
ls[sp.id]=sq.id;
if(!ST.empty())
rs[ST.top().id]=sp.id;
else
rs[0]=sp.id;
ST.push(sp);
}
}
void dfs(int now){
if(now)
printf("(");
if(ls[now])
dfs(ls[now]);
if(now)
printf("%s/%d",ans[now].name,ans[now].priority);
if(rs[now])
dfs(rs[now]);
if(now)
printf(")");
}
int main()
{
while(scanf("%d",&n) && n){
for(int i=1;i<=n;i++){
scanf(" %[a-z]/%d",node[i].name,&node[i].priority);//名字和优先级
//网上学到的输入方法,读到a~z以外的字符就停下,注意前面一定要有空格(跟读char一样)
strcpy(ans[i].name,node[i].name);
ans[i].priority=node[i].priority;
ans[i].id=node[i].id=i;
}
sort(node+1,node+1+n);//排序
build();
dfs(0);//中序遍历
cout<<endl;
memset(ls,0,sizeof(ls));
memset(rs,0,sizeof(rs));
}
return 0;
}