zoukankan      html  css  js  c++  java
  • 给出先序和中序,给一个数找到位置并输出它左子树里最大的数

    题意:

    给出先序和中序,给一个数,找到这个数在树中的位置并输出它左子树里最大的数,如果这个数不在树中,输出-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;
    }
  • 相关阅读:
    从程序员到项目经理(1)
    从程序员到项目经理(26):项目管理不能浑水摸鱼
    职场“常青树”越老越值钱
    阿里巴巴离职DBA 35岁总结的职业生涯
    CEPH RGW多 ZONE的配置
    CEPH 对象存储的系统池介绍
    Windows 下配置 Vagrant 环境
    vagrant 创建虚拟机时遇到问题
    浅谈Ceph纠删码
    磁盘缓存
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/11875581.html
Copyright © 2011-2022 走看看