JOJ 1329: Tree(重建二叉树)

给出二叉树的中序和后序遍历,求树的根到叶的最小结点和的路径上的叶节点的值;思路是在后序找出根,在中序遍历中找出其位置,确定左右儿子,递归建树,在建树的过程直接构建所求。
#include <cstdio>
#include <string.h>

const int maxn=255;
const int Inf=0x7fffffff;
char instr[maxn];
char pstr[maxn];
int num[10],cnt,head[maxn];
int node1 [50];
int node2 [50];

struct edge
{
    int v,adj,next;
}e[maxn];

int min,ans;

void build (int n , int* n1 , int * n2,int sum)
{
    
    if(n==0)return ;
    sum+=*(n2+n-1);
    if(n==1)
    {
        if(min>sum)
        {min=sum ; ans=(*n1);}
        return ;
    }
    int pos=-1;
    for (int i=0 ; i<n ; ++i)if(n1[i]==n2[n-1]){pos=i;break;}
    //printf("pos=%d\n",pos);
    build(pos,n1,n2,sum);
    build(n-pos-1,n1+pos+1,n2+pos,sum);
    //printf("%d \n",node2[n-1]);
}

int main ()
{
    int n,t,i;
    scanf("%d",&t);
    getchar();
    while (t--)
    {
        min=Inf;
        cnt=0;
        memset (head,-1,sizeof(head));
        gets(instr);
        gets(pstr);
        int len =strlen(instr);
        int len2 =strlen(pstr);
        int t,cnt=0,p;
        for (i=0 ,p=0; i<len ; i++)
        {
            if(instr[i+1]==' ' ||instr[i+1]=='\0')
            {
                num[p++]=instr[i]-'0';
                if(p==1)node1[cnt]=num[0];
                if(p==2)node1[cnt]=num[0]*10+num[1];
                if(p==3)node1[cnt]=num[0]*100+num[1]*10+num[2];
                cnt++;
                p=0;
            }
            else 
            if(instr[i]!=' ')num[p++]=instr[i]-'0';
            //printf("%d\n",num[p]);
        }
        cnt=0;
        for (i=0 ,p=0; i<len ; i++)
        {
            if(pstr[i+1]==' ' || pstr[i+1]=='\0')
            {
                num[p++]=pstr[i]-'0';
                if(p==1)node2[cnt]=num[0];
                if(p==2)node2[cnt]=num[0]*10+num[1];
                if(p==3)node2[cnt]=num[0]*100+num[1]*10+num[2];
                cnt++;
                p=0;
            }
            else if(pstr[i]!=' ')num[p++]=pstr[i]-'0';
        }
        for (i= 0 ; i< cnt ;++i )
        build(cnt,node1,node2,0);
        printf("%d\n",ans);
    }
    return 0;
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值