• PAT 1086 Tree Traversals Again


    室友在做于是也做一发,跟已知两种遍历序列还原二叉树的思路类似,感觉PAT上的题目跟书本知识靠的近一些

    #include <iostream>
    #include <cstdio>
    #include <vector>
    
    using namespace std;
    
    void print_data(const vector<char> &as, const vector<int> &ns) {
        int len = ns.size();
        for (int i=0; i<len; i++) {
            if (as[i] == 'i') {
                cout<<"push "<<ns[i]<<endl;
            } else {
                cout<<"pop"<<endl;
            }
        }
    }
    
    void build_postorder(vector<char> &actions, vector<int> &nums, int start, int end, vector<int> &postorder) {
        if (start >= end) return;
        if (actions[start] != 'i') return;
        // root node
        postorder.push_back(nums[start]);
        
        // now try to find the seperator idx of 
        // action(must be a pop pair wise with root node push) between two sub tree
        int pushs = 1;
        int idx = start + 1;
        while (pushs != 0 && idx < end) {
            if (actions[idx] == 'i') {
                pushs++;
            } else {
                pushs--;
            }
            idx++;
        }
        
        // right sub tree
        build_postorder(actions, nums, idx, end, postorder);
        
        // left sub tree
        build_postorder(actions, nums, start + 1, idx, postorder);
    }
    int main() {
        
        int N, len;
        
        scanf("%d", &N);
        len = N * 2;
        
        char buf[10];
        int num;
        
        vector<char> actions(2 * N, '');
        vector<int> nums(2 * N, 0);
        
        // read in data
        for (int i=0; i<len; i++) {
            scanf("%s", buf);
        
            if (buf[3] == 'h') {
                scanf("%d", &num);
                nums[i] = num;
                actions[i] = 'i';    // push, input
            } else {
                actions[i] = 'o';    // pop, output
            }
        }
        
        
        vector<int> postorder;
        
        build_postorder(actions, nums, 0, len, postorder);
        if (postorder.size() > 0){
            // print_data(actions, nums);
            for (int i=N - 1; i>=1; i--) {
                printf("%d ", postorder[i]);
            }
            printf("%d", postorder[0]);
        }
    
        return 0;
    }
  • 相关阅读:
    响应式布局
    C# 基础复习 二 面向对象
    C# 基础复习 一 数据类型
    .net 面试题
    Unity5.X 创建基本的3D游戏场景
    Unity5.X 编辑器介绍
    Unity5.X 开发资源介绍
    SignalR
    vue-cli
    Vue.js
  • 原文地址:https://www.cnblogs.com/lailailai/p/3967525.html
Copyright © 2020-2023  润新知