zoukankan      html  css  js  c++  java
  • PAT Advanced 1086 Tree Traversals Again (25分)

    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

    这题考察了先序、中序转后序
    /**
    pre 1 2 3 4 5 6
    in 3 2 4 1 6 5
    */

    我们可以通过栈的先后,确定先序、中序序列。

    之后用转后序的方法即可

    #include <iostream>
    #include <vector>
    #include <stack>
    using namespace std;
    vector<int> pre, in, ans;
    void post(int root, int start, int _end) {
        if(start > _end) return;
        int i = start;
        while(i < _end && pre[root] != in[i]) i++;
        post(root + 1, start, i - 1);
        post(root + 1 + (i - start), i + 1, _end);
        ans.push_back(pre[root]);
    }
    int main() {
        stack<int> sta;
        int N, tmp_i;
        string tmp_s;
        cin >> N;
        while(N || !sta.empty()) {
            cin>>tmp_s;
            if(tmp_s == "Push") {
                cin >> tmp_i;
                pre.push_back(tmp_i);
                sta.push(tmp_i);
                N--;
            }else {
                in.push_back(sta.top());
                sta.pop();
            }
        }
        post(0, 0, pre.size()-1);
        for(int i = 0; i < ans.size(); i++)
            if(i != ans.size()-1) cout << ans[i] << " ";
            else cout << ans[i];
        system("pause");
        return 0;
    }
  • 相关阅读:
    使用WLC+Portal完成认证
    WLAN PSK认证
    Bug搬运工-flexconnect AP losing Vlan mapping and fall back to default vlan
    Catalyst 9400配置StackWise Virtual
    如何在Wave2 AP上更改时区
    VMware Workstation导入ova镜像文件时报错?
    Password Recovery on Cisco Catalyst 3850
    Mobility Express初始化和升级
    C9300升级-TFTP
    查看WLC的SFP模块信息
  • 原文地址:https://www.cnblogs.com/littlepage/p/12221305.html
Copyright © 2011-2022 走看看