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.

    Input Specification:

    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.

    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
    
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <algorithm>
    #include <iostream>
    #include <string.h>
    #include <queue>
    #include <string>
    #include <set>
    #include <map>
    using namespace std;
    const int maxn = 10000;
    int n;
    int post[maxn], in[maxn];
    struct node {
        int data;
        node* left;
        node* right;
    };
    void layerorder(node* root) {
        queue<node*> q;
        q.push(root);
        int count = 0;
        while (!q.empty()) {
            node* now = q.front();
            q.pop();
            printf("%d", now->data);
            count++;
            if (now->left != NULL) q.push(now->left);
            if (now->right != NULL) q.push(now->right);
            if (count != n) printf(" ");
        }
    }
    node* create(int postl, int postr, int inl, int inr) {
        if (postl > postr) {
            return NULL;
        }
        node* root = new node;
        root->data = post[postr];
        int k;
        for (k = inl; k <= inr; k++) {
            if (in[k] == post[postr]) {
                break;
            }
        }
        int leftnum = k - inl;
        root->left = create(postl, postl + leftnum - 1, inl, k-1);
        root->right = create(postl + leftnum, postr - 1, k + 1, inr);
        return root;
    }
    int main() {
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin>>post[i];
        }
        for (int i = 0; i < n; i++) {
            cin >> in[i];
        }
        node* root = create(0, n - 1, 0, n - 1);
        layerorder(root);
        system("pause");
    }

    注意点:考察基本的二叉树遍历,难点在递归上,想清楚了递归边界和递归式就简单了。二叉树的遍历及建树还需要巩固。

    ---------------- 坚持每天学习一点点
  • 相关阅读:
    oracle,sql server count函数 存储过程 判断 行数 注意事项
    js 跨域访问 获取验证码图片 获取header 自定义属性
    开发作中常用,实用工具推荐!
    phpcms
    php基础
    jQuery , js 写选项卡
    js, jquery实现全选,反选
    jQuery选择器
    学习jQuery
    javascript 与 java继承问题
  • 原文地址:https://www.cnblogs.com/tccbj/p/10392622.html
Copyright © 2011-2022 走看看