题意:
给出先序和中序,给一个数,找到这个数在树中的位置并输出它左子树里最大的数,如果这个数不在树中,输出-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; }