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
有关二叉树前序中序转后序的问题,注意背下模板.先用手算去实现,即在先序序列中找到先序序列的根节点记作Pre_root,而后在中序序列中找到根节点记作I,确保in[i]=pre[pre_root],在中序根节点I 左侧到inl的所有点都是节点I 的左子树,对应的可以求出Pre_r+I –inl+1到inr是节点I的右子树范围。根据后序遍历的方法,遍历函数完成后才要进行节点的输出。
前序序列 pre
中序序列 in
Inl 中序子树的下界
Inr 中序子树的上界
Pre_root 在先序序列中根节点的下标
代码如下,有一个测试点超时
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int>pre,in;
int flag=0;
void root(int pre_r,int inl,int inr)
{
if(inl>inr||flag==1)
{
return;
}
int i=1;
while(in[i]!=pre[pre_r])
{
i++; //i是中序序列的根节点
}
root(pre_r+1,inl,i-1);
root(pre_r+i-inl+1,i+1,inr);
if(flag==0)
{
cout<<in[i];
flag=1;
}
}
//pre_r代表在前序序列中的根节点,inl代表子树所属的下标在中序序列中的上界与下界
int main()
{
cin>>n;
int i=0;
pre.resize(n+1);
in.resize(n+1);
for(i=1;i<=n;i++)
{
cin>>pre[i];
}
for(i=1;i<=n;i++)
{
cin>>in[i];
}
root(1,1,n);
return 0;
}