PAT_甲级_1138 Postorder Traversal

题目大意:

给定一颗二叉树的前序和中序遍历序列,输出后序遍历序列的第一个数字

算法思路:

这里采用不建树但是借鉴建树的过程,后序遍历第一个结点实际上是左子树最左的结点,我们只需要不断递归访问左子树,直到第一次遇到最左的结点即可,这里使用变量c来控制是否是第一次访问,初始为0,在c==0&&preL==preR说明是第一次到达最左的结点,那么就输出当前结点并且++c。

注意点:

  • 1、测试的时间在测试点4时而高时而低,无法通过的多提交几次。

提交结果:

image.png

AC代码:

#include
#include

using namespace std;

struct Node{
    int data;
    Node *left;
    Node *right;
};

int N;
vector pre,in,post;

int c=0; 
void createTree(int preL,int preR,int inL,int inR){
    if(preL>preR||c!=0) 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);
    if(c==0&&preL==preR){
        printf("%d",pre[preL]);
        ++c;
        return;
    }
    return ;
}

int main(){
    scanf("%d",&N);
    for(int i=0;i

你可能感兴趣的:(算法-数据结构,c++)