PAT1020 中序+后续求层次遍历

来源:互联网 发布:棍刀淘宝 编辑:程序博客网 时间:2024/06/06 01:12

题目链接

1020. Tree Traversals (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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:
72 3 1 5 7 6 41 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2
#include<bits/stdc++.h>using namespace std;int in[35];struct Node{    int w;    int l, r;       //左右子树节点下标,-1表示子树为空}node[35];/*递归思想,l1,l2分别代表后续和中序的起始下标,len表示本段的长度*将后序和中序序列划分为 左子树,根节点,右子树三个子段,此处根节点这段不要*后序和中序的左子树和右子树里的元素相同,但顺序可能不同*/int func(int l1, int l2, int len){    if(len < 1)        return -1;    else if(len == 1){        node[l1].l = node[l1].r = -1;        return l1;    }    else{        int m = -1;        //获取根节点在中序序列的位置        for(int i = l2; i < l2 + len; ++i){            if(in[i] == node[l1 + len - 1].w){                m = i;                break;            }        }        int len2 = m - l2;         //新划分的左子树长度        node[l1 + len - 1].l = func(l1, l2, len2);        node[l1 + len - 1].r = func(l1 + len2, m + 1, len - len2 - 1);        return l1 + len - 1;    }}//宽搜void BFS(int n){    queue<Node> que;    int ans[35], Size = 0;    que.push(node[n - 1]);      //头结点如队列    while(!que.empty()){        Node t = que.front();        que.pop();        ans[Size++] = t.w;        if(t.l != -1)            que.push(node[t.l]);        if(t.r != -1)            que.push(node[t.r]);    }    for(int i = 0; i < Size -1; ++i)        printf("%d ", ans[i]);    printf("%d\n", ans[Size - 1]);}int main() {    freopen("/1.txt", "r", stdin);    int n;    scanf("%d", &n);    //将后续序列存于结构体中,中序存于in数组中    for(int i = 0; i < n; ++i)        scanf("%d", &node[i].w);    for(int i = 0; i < n; ++i)        scanf("%d", &in[i]);    func(0, 0, n);    BFS(n);    return 0;}


阅读全文
0 0
原创粉丝点击