L2-011 玩转二叉树 (团体程序设计天梯赛-练习集)

link

#include <bits/stdc++.h>

using namespace std;

vector<int> pre, in, level(100000, -1);

void levelorder(int root, int start, int end, int index){
    if(start > end) return;
    int i = start;
    while(i < end && in[i] != pre[root]) i++;
    level[index] = pre[root];
    levelorder(root + 1, start, i - 1, 2 * index + 1);
    levelorder(root + 1 + i - start, i + 1, end, 2 * index);
    
}
int cnt;

int main(){
	int n;
	scanf("%d", &n);
	pre.resize(n + 1), in.resize(n + 1);
	for(int i = 1; i <= n; i++) scanf("%d", &in[i]);
	for(int i = 1; i <= n; i++) scanf("%d", &pre[i]);
	levelorder(1, 1, n, 1);

    for(int i = 0; i < level.size(); i++){
        if(level[i] != -1 && cnt != n - 1){
            printf("%d ", level[i]);
            cnt++;
        }else if(level[i] != -1){
            printf("%d", level[i]);
            break;
        }
    }
	
    return 0;
}
posted @ 2025-02-24 19:44  awei040519  阅读(33)  评论(0)    收藏  举报