• PAT 甲级 1086 Tree Traversals Again


    https://pintia.cn/problem-sets/994805342720868352/problems/994805380754817024

    An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(); push(4); pop(); pop(); push(5); push(6); pop(); pop(). Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations. Your task is to give the postorder traversal sequence of this tree.


    Figure 1

    Input Specification:

    Each input file contains one test case. For each case, the first line contains a positive integer N (≤) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2 lines follow, each describes a stack operation in the format: "Push X" where X is the index of the node being pushed onto the stack; or "Pop" meaning to pop one node from the stack.

    Output Specification:

    For each test case, print the postorder traversal sequence of the corresponding tree in one line. A solution is guaranteed to exist. All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.

    Sample Input:

    6
    Push 1
    Push 2
    Push 3
    Pop
    Pop
    Push 4
    Pop
    Pop
    Push 5
    Push 6
    Pop
    Pop
    

    Sample Output:

    3 4 2 6 5 1

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    int N;
    vector<int> in, post, pre, val;
    
    void postorder(int root, int st, int en) {
        if(st > en) return;
        int i = st;
        while(i < en && in[i] != pre[root]) i ++;
        postorder(root + 1, st, i - 1);
        postorder(root + 1 + i - st, i + 1, en);
        post.push_back(pre[root]);
    }
    
    int main() {
        scanf("%d", &N);
        stack<int> s;
        string op;
        int cnt = 0;
        for(int t = 0; t < N * 2; t ++) {
            cin >> op;
            if(op == "Push") {
                int x;
                scanf("%d", &x);
                pre.push_back(cnt);
                val.push_back(x);
                s.push(cnt ++);
            } else {
                in.push_back(s.top());
                s.pop();
            }
        }
    
        postorder(0, 0, N - 1);
        for(int i = 0; i < N; i ++) {
            printf("%d", val[post[i]]);
            printf("%s", i != N - 1 ? " " : "");
        }
    
        return 0;
    }
    

      push 的顺序是前序遍历的顺序 按照题目 pop 得到的中序遍历的顺便 in 和 pre 存的是数字的位置 val 求数字的值 递归求出后序遍历 

  • 相关阅读:
    出售几个闲置的玉米
    竞价账户时好时坏怎样分析找到原因?
    两行代码轻松搞定网页自动刷新,简单,实用。
    BCompare文件对比神器 工程师 开发必备工具之一
    关于 Apache 屏蔽 IP 地址
    一段 JavaScript 实现禁止用户打开控制台与鼠标右键查看源码
    Apache使用.htaccess防盗链禁止用户下载
    HTML5下video右键禁用-禁止右键下载视频
    python装饰器
    部署nginx支持lua
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10364656.html
Copyright © 2020-2023  润新知