POJ1785(笛卡尔树中序遍历)

26 篇文章 0 订阅
20 篇文章 0 订阅

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值