AltriaT 2022-04-21 22:22 采纳率: 100%
浏览 14
已结题

做PTAL2-006 树的遍历 (25 分),自己想了一种不用建树的做法,但最后的样例过不掉,为什么呀?

做PTAL2-006 树的遍历 (25 分),自己想了一种不用建树的做法,但最后的样例过不掉,为什么呀?

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

#include<iostream>
#include<unordered_map>
#include<queue>
using namespace std;
unordered_map<int,int> mp;
queue<int> q;
unordered_map<int,int> a;//存的后序遍历节点
unordered_map<int,int> b;//存中序节点的数组下表
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n;i++){
        int t;
        cin>>t;
        b[t]=i;
    }
// 空树
    if(n==0)return 0;
//非空树
    q.push(n-1);
    mp[a[n-1]]=1;
    while(q.size()){
        int t=q.front();
        q.pop();
//从后往前找,中序中的左孩子
        for(int i=t-1;i>=0;i--){
            if(!mp[a[i]]&&b[a[i]]<b[a[t]]){
                q.push(i);
                mp[a[i]]=1;
                break;
            }
        }
//从后往前找,中序中的右孩子
        for(int i=t-1;i>=0;i--){
            if(!mp[a[i]]&&b[a[i]]>b[a[t]]){
                q.push(i);
                mp[a[i]]=1;
                break;
            }
        }
        if(q.size()>0)cout<<a[t]<<" ";
        else cout<<a[t];
    }
    puts("");
    return 0;
}
运行结果及报错内容

img

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 4月29日
    • 创建了问题 4月21日

    悬赏问题

    • ¥15 QTableWidget重绘程序崩溃
    • ¥15 51寻迹小车定点寻迹
    • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
    • ¥15 关于vue2中methods使用call修改this指向的问题
    • ¥15 idea自动补全键位冲突
    • ¥15 请教一下写代码,代码好难
    • ¥15 iis10中如何阻止别人网站重定向到我的网站
    • ¥15 滑块验证码移动速度不一致问题
    • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含
    • ¥15 麒麟V10桌面版SP1如何配置bonding