zoukankan      html  css  js  c++  java
  • 1020 Tree Traversals (25 分)

    1020 Tree Traversals (25 分)
     

    Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

    Input Specification:

    Each input file contains one test case. For each case, the first line gives a positive integer N (≤), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.

    Output Specification:

    For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

    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


    这道题我感觉像是在测你脑回路,挺有趣的,
    这题我用bfs写的,先给你后序遍历(左右中)和中序遍历(左中右)。
    也有看到一些别的题解,比如柳诺大神的题解,但是她的解法如果数据强点就过不去了。
    所以后台数据确实比较水,但是用bfs的代码就不用担心数据量的问题了。
    比如下面这组数据:
    30
    30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
    这组数据她的代码绝对跑不了,因为2^30可是超了int,就算是vector也不可能开这么多,而且那样很浪费空间
    用个bfs写出来就时间空间都解决了。

     1 #include <bits/stdc++.h>
     2 #define N 100
     3 using namespace std;
     4 int an[40], bn[40], n, cn[N],pos = 0;
     5 
     6 struct Node{
     7     int root, start, end;
     8 };
     9 queue<Node> q;
    10 void dfs(int root, int start, int end){
    11     Node node;
    12     node.root = root, node.start = start,node.end = end;
    13     q.push(node);
    14     while(!q.empty()){
    15         node = q.front();
    16         q.pop();
    17         if(node.start > node.end) 
    18             continue;
    19         cn[pos++] = an[node.root];
    20         int i;
    21         for(i = node.start; i < node.end; i++){
    22             if(bn[i] == an[node.root])
    23                 break;
    24         }
    25         q.push({node.root-(node.end-i)-1, node.start, i-1});
    26         q.push({node.root-1, i+1, node.end}); 
    27     }
    28 }
    29 
    30 int main(){
    31     cin >> n;
    32     for(int i = 0; i < n; i++){
    33         cin >> an[i];
    34     }
    35     for(int i = 0; i < n; i++){
    36         cin >> bn[i];
    37     }
    38     memset(cn,-1,sizeof(cn));
    39     dfs(n-1, 0, n-1);
    40     for(int i = 0; i < pos; i++)
    41         printf("%d%c",cn[i],i==pos-1?'
    ':' ');
    42     
    43     return 0;
    44 }

    这里给了一下柳神的代码(虽然是错的,但是可以过题,想法还是挺好的):^v^(勿喷)

    #include <iostream>
    #include <algorithm>
    #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 && in[i] != post[root]) 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;
        scanf("%d", &n);
        post.resize(n);
        in.resize(n);
        for (int i = 0; i < n; i++) scanf("%d", &post[i]);
        for (int i = 0; i < n; i++) scanf("%d", &in[i]);
        pre(n - 1, 0, n - 1, 0);
        sort(ans.begin(), ans.end(), cmp);
        for (int i = 0; i < ans.size(); i++) {
            if (i != 0) cout << " ";
            cout << ans[i].value;
        }
        return 0;
    }
    View Code
     
  • 相关阅读:
    MFC中CTREECTRL的checkbox问题
    GLOG的使用说明
    安装Electron
    WIN32中DLL的建立
    MFC动态创建菜单
    C++迭代器
    VIM常用命令
    层次遍历二叉树
    sql存储过程中加引号
    Apache Tomcat 绿色版安装Service(服务)
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/11033165.html
Copyright © 2011-2022 走看看