PAT p1020 Tree Traversals (25分) 一种和网上大多数人做法不一样的题解

题目:大概就是给定一个二叉树的后序遍历和中序遍历,要求你输出它的层序遍历

输入:

7

2 3 1 5 7 6 4

1 2 3 4 5 6 7

输出

4 1 6 3 5 7 2

我的数据结构一向都是靠异想天开的,让我建一个二叉树,no!代码太丑了,我自己都不想看。(而且之前孤陋寡闻没听说过层序遍历,虽然根据树来说 BFS 也很好想)这题有输出格式的坑,最后一位不能多出来一个空格,空格不能被吞掉。

然后我就开始观察题目,后序遍历,众所周知,根在最后面,然后我看到了中序,可以肯定的是,中序遍历中,根的左边的点都是它的左子树,右边都是它的右子树(废话),而且在后序遍历里同一层的左子树总是会比右子树的优先级高,那就很容易想到一种做法,输入后序(不需要存储)的时候记录每个结点在后序中的位置,并且记录最后一个点(根节点),通过递归的方法在中序遍历中先给左子树加优先级,再给右子树加优先级。优先级代表这个结点在树中的层数。最后进行排序,优先级高或者同一优先级在后序遍历中的位置靠前的结点应当往前排。

排好序后直接输出答案即可。

附上代码

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

ll n, x, p, a[35];

struct node
{
    ll num, id;
}b[35];

void dfs(ll l, ll r, ll pos)
{
    if(l > r)return;
    ll k1 = l;
    for(int i = l;i <= r;++i)
        if(a[b[i].num] > a[b[k1].num])
            k1 = i;
    b[k1].id = pos;
    dfs(l, k1 - 1, pos + 1);
    dfs(k1 + 1, r, pos + 1);
}

bool cmp(node xx, node yy)
{
    return (xx.id < yy.id) || (xx.id == yy.id && (a[xx.num] < a[yy.num]));
}
int main()
{
    cin >> n;
    for(int i = 1;i <= n;++i)
    {
        cin >> x;
        a[x] = i;
    }
    for(int i = 1;i <= n;++i)
    {
        cin >> b[i].num;
        if(b[i].num == x)
            p = i;
    }
    b[p].id = 1;
    dfs(1, p - 1, 2);
    dfs(p + 1, n, 2);
    sort(b + 1, b + n + 1, cmp);
    for(int i = 1;i < n;++i)
        cout << b[i].num << ' '; 
    cout << b[n].num;
    return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值