1. 程式人生 > >PAT 1138 Postorder Traversal [比較]

PAT 1138 Postorder Traversal [比較]

1138 Postorder Traversal (25 分)

Suppose that all the keys in a binary tree are distinct positive integers. Given the preorder and inorder traversal sequences, you are supposed to output the first number of the postorder 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 (≤ 50,000), the total number of nodes in the binary tree. The second line gives the preorder 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 first number of the postorder traversal sequence of the corresponding binary tree.

Sample Input:

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

Sample Output:

3

 題目大意:給出二叉樹的前序和中序,輸出後序遍歷的第一個節點。

//這道題看似簡單,但是容易超時。

#include <iostream>
#include 
<vector> #include<cstdio> using namespace std; vector<int> pre,in,post; void getPost(int inL,int inR,int preL,int preR){ if(inL>inR||post.size()!=0)return ; //if(preL>preR)return ; int i=0; while(in[i]!=pre[preL])i++; getPost(inL,i-1,preL+1,preL+i-inL); getPost(i+1,inR,preL+i-inL+1,preR); post.push_back(pre[preL]); } int main() { int n; cin>>n; int t; for(int i=0;i<n;i++){ cin>>t; pre.push_back(t); } for(int i=0;i<n;i++){ cin>>t; in.push_back(t); } getPost(0,n-1,0,n-1); cout<<post[0]; return 0; }

 

//這樣寫取判斷總有最後兩個或者倒數第二個測試點過不去,執行超時。

//嘗試想傳遞&引用,發現不行,報錯:

\main.cpp|12|error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'|

 

改成以下之後,也就是將函式引數減少一個:

#include <iostream>
#include <vector>
#include<cstdio>
using namespace std;

vector<int> pre,in,post;
void getPost(int inL,int inR,int pr){
    if(inL>inR||post.size()>0)return ;
    //if(preL>preR)return ;
    int i=0;
    while(in[i]!=pre[pr])i++;
    getPost(inL,i-1,pr+1);
    getPost(i+1,inR,pr+i-inL+1);
    post.push_back(pre[pr]);
}
int main() {
    int n;
    cin>>n;
    int t;
    for(int i=0;i<n;i++){
        cin>>t;
        pre.push_back(t);
    }
    for(int i=0;i<n;i++){
        cin>>t;
        in.push_back(t);
    }
    getPost(0,n-1,0);
    cout<<post[0];
    return 0;
}

 

倒數第二個測試點超時。

//忽然想起,將i初始化時改為inL,然後就AC了!!!這樣遍歷的就少了。

主要問題就是i的初始化問題,一定要初始化為inL,修改之後第一個程式碼也過了,說明執行超時不是函式傳參引數個數的問題。