二叉樹的遍歷(中序後序轉層序和前序)

Sample Input:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

Sample Output:
4 1 6 3 5 7 2

先轉換成前序,然後在每一個節點帶一個index,最後排序一下就是層序的結果了

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
struct node{
	int index,value;
};
bool cmp(node a,node b){
	return a.index < b.index;
}
vector<int> post,in;
vector<node> ans;
void pre(int root,int start,int end,int index){
	if(start > end)
	return;
	int i = start;
	while(i < end && post[root] != in[i])i++;//後序的最後一個節點就是前序的第一根
	ans.push_back({index,post[root]});
	pre(root - 1 - end + i,start,i - 1, 2 * index + 1);
	pre(root - 1,i + 1,end,2 * index + 2);
}
int main(){
	int n;
	cin >> n;	
	post.resize(n);
	in.resize(n);
	for(int i = 0;i < n;i++)cin >> post[i];
	for(int i = 0;i < n;i++)cin >> in[i];
	pre(n - 1,0,n - 1,0);
	sort(ans.begin(),ans.end(),cmp);
	cout << ans[0].value;
	for(int i = 1;i < ans.size();i++){
		cout << " " << ans[i].value;
	}
	return 0; 
} 

後序中序轉前序

void pre(int root,int start,int end){
	if(start > end)
	return;
	int i = start;
	while(i < end && post[root] != in[i])i++;
	printf("%d ",post[root]);
	pre(root - 1 - end + i,start,i - 1);
	pre(root - 1,i + 1,end);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章