http://pat.zju.edu.cn/contests/pat-practise/1020

1020. Tree Traversals (25)

时间限制
400 ms
内存限制
32000 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:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2
Node * node = new Node();
delete node;

post order 是后序遍历, in order 是中序遍历
通过找到根节点,然后递归
层次遍历用队列实现

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <string>  
  3. #include <algorithm>  
  4. #include <memory.h>  
  5. #include <cstdio>  
  6. #include <cstdlib>  
  7. #include <queue>  
  8. #include <vector>  
  9. using namespace std;  
  10. #define MAX 0Xfffffff  
  11. struct Node{  
  12.     Node* left, *right;  
  13.     int num;  
  14. };  
  15. int k;  
  16. Node* getTree(vector<int> post, int ps, int pe, vector<int> in, int is, int ie){  
  17.     if(ps>pe || is>ie){  
  18.         return NULL;  
  19.     }else{  
  20.         Node *node = new Node();  
  21.         int num = post[pe];  
  22.         node->num = num;  
  23.         int index;  
  24.         for(int i=0;i<in.size();++i){  
  25.             if(in[i] == num){  
  26.                 index = i;  
  27.             }  
  28.         }  
  29.         node->left = getTree(post, ps, ps+index-1-is, in, is, index-1);  
  30.         node->right = getTree(post, ps+index-is, pe-1, in, index+1, ie);  
  31.         return node;      
  32.     }  
  33. }  
  34. void print(Node * root){  
  35.     queue<Node*> q;  
  36.     q.push(root);  
  37.     bool first = true;  
  38.     while(!q.empty()){  
  39.         Node * node = q.front();  
  40.         q.pop();  
  41.         if(first){  
  42.             first = false;  
  43.         }else{  
  44.             printf(" ");  
  45.         }  
  46.         printf("%d", node->num);  
  47.         if(node->left!=NULL)  
  48.             q.push(node->left);  
  49.         if(node->right!=NULL)  
  50.             q.push(node->right);  
  51.         delete node;  
  52.     }  
  53.   
  54.   
  55. }  
  56. int main(){  
  57.   
  58.    //freopen("in.txt", "r", stdin);  
  59.     
  60.    vector<int> post, in;  
  61.    int n;  
  62.    int t;  
  63.    cin>>n;  
  64.    for(int i=0;i<n;++i){  
  65.         scanf("%d", &t);  
  66.         post.push_back(t);  
  67.    }  
  68.    for(int i=0;i<n;++i){  
  69.         scanf("%d", &t);  
  70.         in.push_back(t);  
  71.    }  
  72.    print(getTree(post, 0, post.size()-1, in, 0, in.size()-1));  
  73.    printf("\n");  
  74.    //fclose(stdin);  
  75. }     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值