您的位置:首页 > 编程语言

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

2014-02-25 16:14 399 查看
/* 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,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: