zoukankan      html  css  js  c++  java
  • PAT A1020 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.
    给出一个二叉树的后序遍历序列和中序遍历序列,求出这棵二叉树的层序遍历序列。
    

    输出格式

    Each input file contains one test case. For each case, the first line gives a positive integer N (≤30), 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.
    

    输出格式

    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.
    

    输入样例

    7
    2 3 1 5 7 6 4 
    1 2 3 4 5 6 7 
    

    输出样例

    4 1 6 3 
    

    《算法笔记》中AC答案

    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <algorithm>
    using namespace std;
    
    const int maxn = 50;
    
    struct node {
        int data;
        node* lchild;
        node* rchild;
    };
    
    int pre[maxn], in[maxn], post[maxn]; //先序, 中序, 后序
    int n; // 结点个数
    
    // 当前二叉树的后序序列区间为[postL, postR], 中序序列区间为[inL, inR]
    // create 函数返回构建出的二叉树的根结点地址
    node* create(int postL, int postR, int inL, int inR) {
        if(postL > postR) {
            return NULL; // 后序序列长度小于等于0时,直接返回
        }
        node* root = new node; // 新建一个新的结点,用来存放当前二叉树的根结点
        root->data = post[postR]; //新结点的数据域为根结点的值
        int k;
        for(k = inL; k <= inR; k++) {
            if(in[k] == post[postR]) { // 在中序序列中找到in[k] == pre[L]的结点
                break;
            }
        }
        int numLeft = k - inL; // 左子树的结点个数
        // 返回左子树的根结点地址,赋值给root的左指针
        root->lchild = create(postL, postL + numLeft - 1, inL, k - 1);
        // 返回右子树的根结点地址,赋值给root的右指针
        root->rchild = create(postL + numLeft, postR - 1, k + 1, inR);
        return root; // 返回根结点地址
    }
    
    int num = 0; // 已输出的结点个数
    void BFS(node* root) {
        queue<node*> q; //注意队列里是存地址
        q.push(root); // 把根结点地址入队
        while(!q.empty()) {
            node* now = q.front(); // 取出队首元素
            q.pop();
            printf("%d", now->data);
            num++;
            if(num < n) printf(" ");
            if(now->lchild != NULL) q.push(now->lchild); // 左子树非空
            if(now->rchild != NULL) q.push(now->rchild); // 右子树非空
        }
    }
    
    int main() {
        #ifdef ONLINE_JUDGE
        #else
            freopen("1.txt", "r", stdin);
        #endif
        scanf("%d", &n);
        for(int i = 0; i < n; i++) {
            scanf("%d", &post[i]);
        }
        for(int i = 0; i < n; i++) {
            scanf("%d", &in[i]);
        }
        node* root = create(0, n - 1, 0, n - 1); // 建树
        BFS(root); // 层序遍历
        return 0;
    }
    
    
  • 相关阅读:
    07-图4 哈利·波特的考试 (25分)
    Windows环境下清除SVN文件
    查看SQL SERVER 2008R2 表大小
    Oauth支持的5类 grant_type 及说明
    SignalR的性能监测
    Loadrunner11安装
    Azure ServiceBus 通信失败问题
    sql server text类型 存储问题
    System.BadImageFormatException
    InputStream只能读取一次的解决办法 C# byte[] 和Stream转换
  • 原文地址:https://www.cnblogs.com/isChenJY/p/11867826.html
Copyright © 2011-2022 走看看