zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    java中间件
    JAVA 并发编程关键点
    pull类型消息中间件-消息服务端(三)
    pull类型消息中间件-消息消费者(二)
    pull类型消息中间件-消息发布者(一)
    push类型消息中间件-消息服务端(三)
    push类型消息中间件-消息发布者(二)
    push类型消息中间件-消息订阅者(一)
    RPC框架基本原理(三):调用链路分析
    JAVA包装类
  • 原文地址:https://www.cnblogs.com/bernieloveslife/p/8046530.html
Copyright © 2011-2022 走看看