Description
用顺序存储实现二叉树。读入一棵二叉树,输出后序遍历的结果。
Input Format
第一行,一个整数 n,表示这棵树有 n 个节点。这 n 个节点编号为 1 到 n。
接下来 n 行,描述每个节点的左右儿子情况。每行包含三个整数 x y z,表示编号为 x 的节点的左儿子编号为 y,右儿子编号为 z。若 y=-1 或 z=-1,表示 x 没有左子树或右子树。
编号为 1 的节点为树的根节点。
Output Format
第一行:输出 n 个整数,第 i 个整数为编号 i 的节点在顺序存储的数组中的下标。输出的数之间用一个空格隔开。
第二行:输出这个树的后序遍历的结果,输出的数之间用空格隔开。
Hint
N<=30000,树的高度保证不超过15。
输入中,除了根节点外,每个节点的描述总在它的父节点的描述出现之后给出。
Sample Input
5
1 2 4
4 5 -1
5 -1 -1
2 -1 3
3 -1 -1
Sample Output
1 2 5 3 6 3 2 5 4 1
#include <iostream>
#include <map>
using namespace std;
map<int,int> arr;
map<int,int> rarr;
void reverse_map(){
for(pair<int,int> p:arr)
rarr[p.second] = p.first;
}
void postTravel(int i){
if(rarr.find(2*i)!=rarr.end())
postTravel(2*i);
if(rarr.find(2*i+1)!=rarr.end())
postTravel(2*i+1);
if(rarr.find(i)!=rarr.end())
cout<<rarr[i]<<" ";
}
int main()
{
int n;
cin>>n;
arr[1] = 1;
for(int i=0;i<n;i++){
int ro,le,ri;
cin>>ro>>le>>ri;
int x = arr[ro];
if(le!=-1)
arr[le] = 2*x;
if(ri!=-1)
arr[ri] = 2*x + 1;
}
for(pair<int,int> p:arr)
cout<<p.second<<" ";
cout<<endl;
reverse_map();
postTravel(1);
return 0;
}