L2-006 樹的遍歷(BFS)

YuKiCheng發表於2024-04-20

注意判斷條件那個pr,pl位置不要寫反了。我兩次都寫錯了。

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
#define ll long long
const int N = 40;
int L[N],R[N];
int in[N],post[N];
int build(int pl,int pr,int il,int ir){
	if(pr<pl) return -1;
	int root=post[pr];
	int i=il;
    for(;i<=ir;i++){
    	if(in[i]==root){
    		break;
		}
	} 
	int lsize=i-il;
	int rsize=ir-i;
	L[root]=build(pl,pl+lsize-1,il,i-1);
	R[root]=build(pr-rsize,pr-1,i+1,ir);
	return root;
}
void bfs(int root){
	queue<int> que;
	que.push(root);
	int count=0;
	while(!que.empty()){
		int x =que.front();
		que.pop();
		if(count) cout << " ";
		cout <<x;
		count++;
		if(L[x]!=-1) que.push(L[x]);
		if(R[x]!=-1) que.push(R[x]);
	}
}
int main(){
	int n;
	cin>>n;
	//後序
	for(int i=0;i<n;i++) cin>>post[i];
	for(int i=0;i<n;i++) cin>>in[i];
    int root = build(0,n-1,0,n-1);
    bfs(root);
	return 0;
}

相關文章