A1099

本題是由已知二叉樹遍歷得到中序遍歷序列的逆用.
已知二叉樹中序遍歷序列,將每個結點的權重存入二叉樹.
用數組存儲,遍歷過程與鏈表一致,由數組下標指向左右孩子代替鏈表指針指向左右孩子.
同類型題:A1064.

#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=110;
int t[maxn],idx=0;
struct node{
	int data;
	int left_index;
	int right_index;
}nodes[maxn];
bool cmp(int a,int b){
	return a<b;
}
void inorder(int root){           //中序遍歷
	if(root==-1){
		return;
	}
	inorder(nodes[root].left_index);
	nodes[root].data=t[idx++];
	inorder(nodes[root].right_index);
}
void levelorder(int root){         //層序遍歷
	queue<int> q;
	q.push(root);
	while(!q.empty()){
		int now=q.front();
		q.pop();
		if(nodes[now].left_index!=-1){
			q.push(nodes[now].left_index);
		}
		if(nodes[now].right_index!=-1){
			q.push(nodes[now].right_index);
		}
		printf("%d",nodes[now].data);
		if(!q.empty()){
			printf(" ");
		}
	}
}
int main(){
	#ifdef ONLINE_JUDGE
	#else
		freopen("1.txt","r",stdin);
	#endif
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d %d",&nodes[i].left_index,&nodes[i].right_index);
	}
	for(int i=0;i<n;i++){
		scanf("%d",&t[i]);
	}
	sort(t,t+n,cmp);
	inorder(0);
	levelorder(0);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章