1039. 顺序存储二叉树

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;
}


原文地址:https://www.cnblogs.com/bernieloveslife/p/8046530.html