pat甲級 1020. Tree Traversals map遞歸建樹 + BFS

先用map建立一棵二叉樹,mr存右孩子節點,ml存左孩子節點,然後輸出BFS路徑就行了


#include <cstdio>
#include <iostream>
#include <cstring>
#include <map>
#include <queue>

using namespace std;

int N;
int po[35], in[35], prin[35];
int root, ip, len;
map<int, int> ml, mr;

int solve(int l, int r) {
	if (l > r) return -1;
	if (l == r) {
		ml[in[l]] = -1;
		mr[in[l]] = -1;
		ip--;  //debug
		return in[l];
	}
	int ii, x;
	for (int i = l; i <= r; i++) {
		if (in[i] == po[ip]) {
			ii = i;
			x = in[i];
			ip--;
			break;
		}
	}
	mr[x] = solve(ii + 1, r);
	ml[x] = solve(l, ii - 1);
	return x;
}

void bfs() {
	queue<int> Q;
	Q.push(root);
	len = 0;
	while (!Q.empty()) {
		int tn = Q.front();
		Q.pop();
		prin[len++] = tn;
		if (ml[tn] != -1) Q.push(ml[tn]);
		if (mr[tn] != -1) Q.push(mr[tn]);
	}
}

int main()
{
	cin >> N;
	for (int i = 0; i < N; i++) {
		scanf("%d", &po[i]);
	}
	for (int i = 0; i < N; i++) {
		scanf("%d", &in[i]);
	}
	ip = N - 1;
	root = solve(0, N - 1);
	bfs();
	for (int i = 0; i < len; i++) {
		printf(i == 0 ? "%d" : " %d", prin[i]);
	}
	puts("");
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章