PAT 团体程序设计天梯赛-练习集 L2-006. 树的遍历【数据结构】

本文介绍了一种根据二叉树的后序和中序遍历结果,实现层次遍历输出的方法。通过寻找根节点,并在中序遍历中划分左右子树,最终实现了层次遍历的输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目连接

https://www.patest.cn/contests/gplt/L2-006

思路

给你一棵二叉树的后序和中序遍历,叫你输出层次遍历。
首先找到根节点,就是后序的最后一个数。
然后分别在中序中找这个数的左边和右边,分别挑出在后序中排最后的数,注意遇到已经确定过的数要停止搜索。

AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <unordered_map>
using namespace std;


int tree[50];
int post[50], in[50], vis[50];
unordered_map<int, int>order;
int main()
{

    int n;
    scanf("%d",&n);
    for(int i=1 ; i<=n ; ++i)
    {
        scanf("%d",&post[i]);
        order[post[i]]=i;
    }
    for(int i=1 ; i<=n ; ++i)
    {
        scanf("%d",&in[i]);
    }
    queue<int>q;
    q.push(post[n]);
    int cnt=1;
    for(int step=1 ; step<=n ; ++step)
    {
        int u=q.front(); q.pop();
        vis[u]=1;
        tree[cnt++]=u;
        for(int i=1 ; i<=n ; ++i)if(in[i]==u)
        {
            int max_order=0, last_num=-1;
            for(int j=i-1 ; j>=1 && !vis[in[j]] ; --j)
            {
                if(order[in[j]]>max_order)
                {
                    max_order=order[in[j]];
                    last_num=in[j];
                }
            }
            if(last_num!=-1) q.push(last_num);
            max_order=0; last_num=-1;
            for(int j=i+1 ; j<=n && !vis[in[j]] ; ++j)
            {
                if(order[in[j]]>max_order)
                {
                    max_order=order[in[j]];
                    last_num=in[j];
                }
            }
            if(last_num!=-1) q.push(last_num);
            break;
        }
    }
    for(int i=1 ; i<cnt ; ++i)
    {
        if(i==1) printf("%d", tree[i]);
        else printf(" %d", tree[i]);
    }
    printf("\n");
    return 0;
}
### 团体程序设计天梯赛练习与在线评测系统 团体程序设计天梯赛提供了一个全面的练习平台,参赛者可以在PAT (Programming Ability Test)网站上找到丰富的练习资源[^1]。该竞赛旨在通过一系列具有挑战性的编程问题来评估团队和个人的能力。 #### 在线评测系统的特色 - **广泛覆盖**:提供了大量的练习题目,涵盖了不同难度级别,适合各个层次的学习者。 - **即时反馈**:提交代码后能够立即获得运行结果和评分情况,帮助快速定位并修正错误。 - **模拟环境**:创建真实的比赛场景,使参与者熟悉正式考试流程,减少紧张感。 - **社区交流**:拥有活跃的技术讨论区,可以与其他程序员分享经验、解决问题。 对于希望参加团体程序设计天梯赛的人来说,在线评测系统不仅是一个有效的训练工具,也是一个提升技能的好地方。它允许用户按照自己的节奏学习和发展,同时准备应对实际比赛中可能遇到的各种挑战[^2]。 ```python # 示例:如何连接到PAT在线评测系统进行登录操作(伪代码) import requests def login_to_pat(username, password): url = "https://www.patest.cn/users/sign_in" payload = { 'user[login]': username, 'user[password]': password } session = requests.Session() response = session.post(url, data=payload) if response.status_code == 200: print("Login successful!") else: print("Failed to log in.") # 使用方法 login_to_pat('your_username', 'your_password') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值