uva 548

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章