PAT(Lowest Common Ancestor)


一开始的思路是中序遍历的结果就是对前序遍历排序之后从小到大的输出序列。有了中序还有前序遍历的数组,我们可以利用恢复二叉树的理论从根节点不断下沉(通过l和r保留先序遍历的位置点,取pre[l]为根节点),得到第一个a

但是后来一想,有更好的方法。因为当你从左往右遍历全部先序数组的时候,如果有a

一开始的解:

#include
#include
#include
#include
using namespace std;
unordered_mapm;
bool cmp(int &a,int &b){
    return a&pre,vector&in,int a,int b,int l,int r){
    bool aa=exist(a);
    bool bb=exist(b);
    int middle=pre[0];
    // middle是根节点的值,mid是在中序遍历中的具体位置
    // l和r用来指向先序遍历的范围
    if(aa&&bb){
        int minab=min(a,b);
        int maxab=max(a,b);
        while(!(middle>=maxab&&middle<=minab)){
           if(middle==a){
               printf("%d is an ancestor of %d.\n",a,b);
               return;
           }   
           else if(middle==b){
               printf("%d is an ancestor of %d.\n",b,a);
               return;
           }
           else if(middle>minab&&middlemaxab){
                   r=mid;
                   l+=1;
               }
               else if(middle<=minab){
                   l=mid+1;
               }
               middle=pre[l];
           }
        }
    }
    // a,b至少一个不存在
    else{
        if(!aa&&!bb){
            printf("ERROR: %d and %d are not found.\n",a,b);
        }
        else if(!aa){
            printf("ERROR: %d is not found.\n",a);            
        }
        else if(!bb){
            printf("ERROR: %d is not found.\n",b);            
        }
    }
}
int main(){
    // freopen("inputs.txt","r+",stdin);
    vectorpre,in;
    int i,j,input;
    int num,test;
    scanf("%d %d",&test,&num);
    // 先序遍历的输出结果(隐藏了排序之后其实就是中序遍历的结果,根据中序还有前序就可以知道真正的解了)
    for(i=0;i>input;
        pre.push_back(input);
        in.push_back(input);
    }
    sort(in.begin(),in.end(),cmp);
    for(i=0;i

后来:

#include
#include
#include
#include
using namespace std;
unordered_mapm;
bool cmp(int &a,int &b){
    return a&pre,vector&in,int a,int b){
    bool aa=exist(a);
    bool bb=exist(b);
    int point=0;
    int middle=pre[point];
    // middle是根节点的值,mid是在中序遍历中的具体位置
    // l和r用来指向先序遍历的范围
    if(aa&&bb){
        int minab=min(a,b);
        int maxab=max(a,b);
        while(1){
           if(middle==a){
               printf("%d is an ancestor of %d.\n",a,b);
               return;
           }
           else if(middle==b){
               printf("%d is an ancestor of %d.\n",b,a);
               return;
           }
           else if(middle>minab&&middlepre,in;
    int i,j,input;
    int num,test;
    scanf("%d %d",&test,&num);
    // 先序遍历的输出结果(隐藏了排序之后其实就是中序遍历的结果,根据中序还有前序就可以知道真正的解了)
    for(i=0;i>input;
        pre.push_back(input);
        in.push_back(input);
    }
    sort(in.begin(),in.end(),cmp);
    for(i=0;i

你可能感兴趣的:(PAT(Lowest Common Ancestor))