题目大意:
给定一颗二叉树的前序和中序遍历序列,输出后序遍历序列的第一个数字
算法思路:
这里采用不建树但是借鉴建树的过程,后序遍历第一个结点实际上是左子树最左的结点,我们只需要不断递归访问左子树,直到第一次遇到最左的结点即可,这里使用变量c来控制是否是第一次访问,初始为0,在c==0&&preL==preR说明是第一次到达最左的结点,那么就输出当前结点并且++c。
注意点:
- 1、测试的时间在测试点4时而高时而低,无法通过的多提交几次。
- 2、在c!=0的时候就说明已经输出后序第一个节点了,这样就需要提前return不然超时的可能性更大。
提交结果:
AC代码:
#include<cstdio>
#include<vector>
using namespace std;
struct Node{
int data;
Node *left;
Node *right;
};
int N;
vector<int> pre,in,post;
int c=0;
void createTree(int preL,int preR,int inL,int inR){
if(preL>preR || c!=0) return ;
if(c==0&&preL==preR){
printf("%d",pre[preL]);
++c;
return;
}
int k;// 中序序列中根节点的位置
for(k=inL;k<=inR;++k){
if(pre[preL]==in[k]) break;
}
int numOfLeft = k-inL;
createTree(preL+1,preL+numOfLeft,inL,k-1);
createTree(preL+numOfLeft+1,preR,k+1,inR);
return ;
}
int main(){
scanf("%d",&N);
for(int i=0;i<N;++i){
int a;
scanf("%d",&a);
pre.push_back(a);
}
for(int i=0;i<N;++i){
int a;
scanf("%d",&a);
in.push_back(a);
}
createTree(0,N-1,0,N-1);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。