uva 548

来源:互联网 发布:索尼kdl60w600b装软件 编辑:程序博客网 时间:2024/05/22 17:32

uva 548

这个题是一个关于利用二叉树的中序和后序来确定一棵树的题,先前全做的都是通过先序和中序来确定一颗二叉树,所以还想了好久。

总体思路就是,现将二叉树的后序遍历的顺序直接反转,然后通过后序遍历反转以后的第一个数字就是根节点,下来是右子树,下来是左子树以此类推就可以了。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Tnode{
    int value;
    int node;
}Node;
Node value[30000];
int index=0,the_min=9999999;
void build(int n,int *s1,int *s2,int total){
    int p;
    if(n<=0)
        return;
    total+=s1[0];
    if(n==1){
        value[index].value=total;
        value[index].node=s1[0];
        index++;
        if(the_min>total)
            the_min=total;
    }
    p=search(s1[0],s2,n);
    build(n-p-1,s1+1,s2+p+1,total);
    build(p,s1+(n-p),s2,total);
}
int search(int num,int * arr,int len){
    int i;
    for(i=0;i<len;i++)
        if(arr[i]==num)
            return i;
    return 0;
}
int reverse(int *arr,int len){
    int i,temp;
    for(i=0;i<len/2;i++){
        temp=arr[i];
        arr[i]=arr[len-i-1];
        arr[len-i-1]=temp;
    }
}
int main(){
    int input1[30000],i=0,j,input2[30000],flag=0,total=0,k;
    char ch;
    while(scanf("%d%c",input1+i,&ch)==2){
        if(ch=='\n')
            flag=1;
        else
            i++;
        while(flag==0 && scanf("%d%c",input1+i,&ch)==2){
            if(ch=='\n')
                break;
            i++;
        }
        for(j=0;j<=i;j++)
            scanf("%d%*c",input2+j);
        reverse(input2,j);
        build(j,input2,input1,total);
        flag=i=0;
        for(k=0;k<index;k++)
            if(value[k].value==the_min)
                printf("%d\n",value[k].node);
        index=0;
        the_min=99999999;
    }
    return 0;
}

0 0
原创粉丝点击