给出先序和中序,给一个数找到位置并输出它左子树里最大的数

题意:

给出先序和中序,给一个数,找到这个数在树中的位置并输出它左子树里最大的数,如果这个数不在树中,输出-1

样例输入:

9

20 15 10 12 18 16 17 25 30
10 12 15 16 17 18 20 25 30

样例输出:

15

代码:

#include<iostream>
#include<algorithm>
using namespace std;
struct Tree
{  
    int data;  
    struct Tree *left,*right;  
};
int a[105];
int b[105];
int mm=0;
Tree *Pre_and_in(int *pre,int *in,int n){
    Tree *b;
    int *p;
    int k;
    if(n<=0) return NULL;
    b=(Tree*)malloc(sizeof(Tree));
    b->data=*pre;
//要在中序序列中找到根节点
    for(p=in;p<in+n;p++){
        if(*p==*pre)
            break;
    }
    k=p-in;//统计根节点的左子树节点数in=0,p=根节点下标
    b->left=Pre_and_in(pre+1,in,k);
    b->right=Pre_and_in(pre+k+1,p+1,n-k-1);
    return b;
}
void dfs(Tree*T){//找x的左子树最大的数 
    if(T){
        if(mm<T->data) mm=T->data;
        if(T->left) dfs(T->left);
        if(T->right) dfs(T->right);    
    }
}
int search(int x,Tree*T){//先找到x 
    if(T->data==x){
        if(T->left) dfs(T->left);
        else mm=x;
        return 1;
    }else{
        if(T->left) search(x,T->left);
        if(T->right) search(x,T->right);    
    }
}
int main()
{
    struct Tree *T;
    int n;
    cin>>n; 
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    for(int i=0;i<n;i++)
    {
        cin>>b[i];
    }
    T=Pre_and_in(a,b,n);
    int x;
    cin>>x;
    if(search(x,T)==-1) cout<<"-1";
    else cout<<mm;  
    return 0;
}

 

posted on 2019-11-17 10:42  蔡军帅  阅读(155)  评论(0编辑  收藏  举报