1127 ZigZagging on a Tree (30 分)

題目地址:https://pintia.cn/problem-sets/994805342720868352/problems/994805349394006016
題意:給出樹的中序後序,要求以蛇皮走位(Z字形)輸出層序
解法:總體思路很簡單.建樹,然後找到正常的層序,遍歷的時候按奇偶左右遍歷
坑點:
1.題目N<30,開始還在想爲什麼值這麼小,用數組交了一發,發現有段錯誤.感覺應該會有全是右節點這種鏈狀樹.相當於用數組模擬的話要1e9. 解法:map
2.數組模擬時,我Z字形是一位位訪問過去,在1e9情況顯然不行. 解法: 在把同一層的層序放一起,最終輸出的時候在判斷.
代碼:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 1e3+10;
int pos[N];
int mid[N];
map<int,int> mp;
vector<int> ans[40];
int n;
int work(int l,int r,int now,int rt,int cnt){
	if(l>r || now<1) return 0;
	int i,j,f=0,tmp;
	for(j=now;j>=1;j--){
		for(i=l;i<=r;i++) 
			if(mid[i]==pos[j]) {f=1;break;}
		if(f) break;
	}
	if(i==r+1) return 0;
	tmp = work(l,i-1,j-1,rt<<1,cnt+1); if(tmp) ans[cnt+1].push_back(tmp);
	tmp = work(i+1,r,j-1,rt<<1|1,cnt+1); if(tmp) ans[cnt+1].push_back(tmp);
	return pos[j];
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>mid[i];
	for(int i=1;i<=n;i++) cin>>pos[i];
	ans[1].push_back(work(1,n,n,1,1));
	cout<<ans[1][0];
	for(int i=2;i<=30;i++){
		if(i&1)
			for(int j=ans[i].size()-1;j>=0;j--)
				printf(" %d",ans[i][j]);		
		else 
			for(int j=0;j<ans[i].size();j++)
				printf(" %d",ans[i][j]);
	}
	cout<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章