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>
using namespace std;
vector<int> pre, in;
bool flag = false;
void postOrder(int prel, int inl, int inr){
if(inl > inr || flag == true) return;
int i = inl;
while(pre[prel] != in[i]) i ++;
postOrder(prel + 1, inl, i - 1);
postOrder(prel + i - inl + 1, i + 1, inr);
if(flag == false){
printf("%d", pre[prel]);
flag = true;
}
}
int main(){
int n;
scanf("%d", &n);
pre.resize(n);
in.resize(n);
for(int i = 0; i < n; i ++) scanf("%d", &pre[i]);
for(int i = 0; i < n; i ++) scanf("%d", &in[i]);
postOrder(0, 0, n - 1);
return 0;
}
|