1127 ZigZagging on a Tree (30分)

1.後序+中序 確定層次遍歷

2.用的是中序區間和後序區間來進行遍歷(也可以用Tree Traversals (25分)中後序確定根結點+中序區間來做,因爲後序區間也就可以判斷根結點)

3.層次遍歷看樣例是第一行逆序,第二行正序,,以此類推  所以用vector來存儲每行的節點  在判斷是奇數層還是偶數層

#include<iostream>
#include<vector>

using namespace std;

const int N = 1000000+5;
int in[N], po[N];//中  後
vector<int> v[N];
int ans = 0;
void level(int il, int ir, int pol, int por, int l) {//先序遍歷
//	cout << il << " " << ir << endl;
	if(il > ir) return;
	int i;

	for(i=il; i<=ir; i++) {
		if(in[i] == po[por]) {
			break;
		}
	}
//	cout << "得到的pos"<< i << endl;
	int num = i-il;//子樹節點數
//	cout << l << "所對應的:"<< po[por] << endl;
	level(il, i-1, pol, pol+num-1, l+1);//左子樹
	v[l].push_back(po[por]);
	level(i+1, ir, pol+num, por-1, l+1);//右子樹
	ans = max(ans, l);
}

int main() {
	int n;

	cin >> n;

	for(int i=0; i<n; i++) {
		cin >> in[i];//左右根
	}
	for(int i=0; i<n; i++) {
		cin >> po[i];//左根右
	}
	level(0, n-1, 0, n-1, 0);

	for(int i=0; i<=ans; i++) {
		if(i%2) {
			for(int j=0; j<v[i].size(); j++) {
				n--;
				printf("%d%c", v[i][j], " \n"[n==0]);
			}
		} else 	for(int j=v[i].size()-1; j>=0; j--) {
				n--;
				printf("%d%c", v[i][j], " \n"[n==0]);
			}

	}

	return 0;
}

 

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