存下自己尝试的代码 UVA 548 题意不理解,英语捉急。但是有收获

/*  problem:tree
    coder:commence
    data:2014.2.24
    result:unknown
    general idea:已知二叉树的中序后序,求二叉树最短路径的长度,输出这条路径上的所有值,如果最小路径的长度有多条,输出最小路径中值最小的那棵树的值
    */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#define MAXN 10000
typedef struct node
{
    int val;
    struct node *left;
    struct node *right;
}Node;
int getans[MAXN];
int record[MAXN][MAXN];
int post[MAXN],in[MAXN];
int accel;
void intcpy(int *tag,int *src,int len)
{
    int i;
    for (i=0;i<len;i++)
        tag[i]=src[i];
}
void debtree(Node*root)
{
    if (root!=NULL)
    {
        debtree(root->left);
        debtree(root->right);
        free(root);
    }
}
int getindex(int tag[],int src,int len)
{
    int i;
    for (i=0;i<=len;i++)
        if (tag[i]==src) return i;
    return -1;//-1代表没有对应元素
}
Node *buildtree(int inorder[],int postorder[],int len,int *issuccess)
{
    if (len<=0 || issuccess==0) return NULL;
    int index=getindex(inorder,postorder[len-1],len);
    if (index<0)
    {
        *issuccess=0;
        fprintf(stderr,"error no correspond item");
        return NULL;
    }
    Node* root=(Node*)malloc(sizeof(Node));
    if (!root)
    {
        *issuccess=0;
        fprintf(stderr,"out of memory");
        return NULL;
    }
    root->val=postorder[len-1];
    int leftlength=index;
    int rightlength=len-1-index;
    root->left=buildtree(inorder,postorder,leftlength,issuccess);
    root->right=buildtree(inorder+leftlength+1,postorder+leftlength,rightlength,issuccess);
    return root;
}
void dfs(Node *root,int (*re)[MAXN],int *cur1,int cur2)//这里这么调用把,dfs(root,record,&a,0) 另外有赋值int a=0;还是没有空腹树根的问题
{
    if (root!=NULL)
    {
        re[*cur1][cur2]=root->val;
        printf("--%d#%d*%d\n",root->val,*cur1,cur2);
    }
    if (root->left==NULL && root->right==NULL)
    {
        accel=1;
        return ;
    }
    if (root->left!=NULL)
              dfs(root->left,re,cur1,cur2+1);
              if (accel) {(*cur1)++;        intcpy(re[*cur1],re[(*cur1)-1],cur2+1);}
    if (root->right!=NULL)
           dfs(root->right,re,cur1,cur2+1);
}   //第一次写DFS写错了,开始重写,建树DFS结束,销毁,初始化,设定再主函数进行
void show(int (*re)[MAXN])
{
    int i,j;
    for (i=0;re[i][0]!=-1;i++)
        {for (j=0;re[i][j]!=-1;j++)
        printf("%d ",re[i][j]);
        putchar('\n');
        }
}
void showtree(Node *root)
{
    if (root->left!=NULL)
        showtree(root->left);
        if (root!=NULL)
    printf("%d ",root->val);
    if (root->right!=NULL)
        showtree(root->right);
}
int main()
{
    int flag=0,j;//min依存于minroad注意这里有一个关系,这里处理输入
    while (1)
    {       int n=0,i,issuccess=0,cur1=0,min=10000,minroad=10000,k;
            char ch;
            for (n=0;scanf("%d%c",&in[n++],&ch);)
            {
                if (ch=='\n')
                {
                    for (i=0;i<n;i++)
                        scanf("%d",&post[i]);
                    break;
                }
            }
            memset(record,-1,sizeof(record));
            memset(getans,0,sizeof(getans));//记录相同路经长的路径
            Node *root;
            root=buildtree(in,post,n,&issuccess);
            showtree(root);
            putchar('\n');
            dfs(root,record,&cur1,0);
            show(record);
            debtree(root);
            for (i=0;record[i][0]!=-1;i++)
                for (j=0;record[i][j]!=-1;j++)
                getans[i]=j;
            for (j=0;j<i;j++)
                if (getans[j]<minroad) {minroad=getans[j];k=j;}
            for (j=0;j<i;j++)
           {   if (j==k) continue;
               if (getans[j]==minroad) {flag=1;break;}
           }
            if (flag)
                {
                    for (j=0;j<i;j++)
                        if (getans[j]==minroad)
                    {  int k;
                        for (k=0;record[j][k]!=-1;k++)
                            if (record[j][k]<min) min=record[j][k];
                    }
                }
                if (flag)printf("minans=%d\n",min);
                else printf("minroadans=%d",minroad);


    }
    return 0;
}
// 存树DFS,成功yeah,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值